Sowie Einzelpersonen innerhalb von Gruppen
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)
}
Hilfreichster Kommentar
Die obige Antwort von @drhagen sieht aus, als wäre sie veraltet. Das scheint jetzt zu funktionieren: