Dplyr: Sie müssen in der Lage sein, Gruppen zu beproben

Erstellt am 28. März 2014  ·  9Kommentare  ·  Quelle: tidyverse/dplyr

Sowie Einzelpersonen innerhalb von Gruppen

Hilfreichster Kommentar

Die obige Antwort von @drhagen sieht aus, als wäre sie veraltet. Das scheint jetzt zu funktionieren:

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}

Alle 9 Kommentare

species <- iris %.% 
  group_by(Species) %.% 
  summarise(wt = sum(Sepal.Length)) %.%
  sample_n(5, replace = T, weight = wt) %.%
  select(-wt)

inner_join(species, iris)

Ich frage mich, warum das geschlossen wurde? Scheint eine potenziell nützliche Funktion zu sein

iris %>%
    group_by(Species) %>%
    sample_n(1)

um alle Daten von einer zufälligen Spezies auszuwählen, zB

Ich glaube nicht, dass sich das Verhalten von sample_n für Gruppen ändern sollte, da das Sampling innerhalb von Gruppen sein intuitives Verhalten ist. Es ist jedoch oft praktisch, Gruppen als Ganzes zu beproben. Dies sollte eine zweite Funktion sein. Hier meine Umsetzung:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
   # regroup when done
   grps = tbl %>% groups %>% unlist %>% as.character
   # check length of groups non-zero
   keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
   # keep only selected groups, regroup because joins change count.
   # regrouping may be unnecessary but joins do something funky to grouping variable
   tbl %>% semi_join(keep) %>% group_by_(grps) 
}

Das Beispiel von @rcorty funktioniert wie erwartet

iris %>% group_by(Species) %>% sample_n_groups(1)

+1

Bearbeiten: Eine Änderung in dplyr diese Lösung gebrochen;


Für diejenigen unter Ihnen, die über eine Suchmaschine hierher gekommen sind und nach dieser Funktionalität gesucht haben, wird die Implementierung von @MarcusWalz nicht mit Ersetzung bei replace = TRUE abgetastet . Die Implementierung muss right_join (oder left_join oder inner_join ) verwenden, um die Duplikate zu behalten:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

Cluster-Bootstrapping ist ein weit verbreiteter Anwendungsfall für diese Funktion.

@drhagen , haben Sie in Ihrer Implementierung Vorschläge zum Generieren einer neuen eindeutigen Gruppen-ID?

Eigentlich ist das ganz einfach:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight) %>% 
    mutate(unique_id = 1:NROW(.))
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

Die obige Antwort von @drhagen sieht aus, als wäre sie veraltet. Das scheint jetzt zu funktionieren:

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen