Ainsi que des individus au sein de groupes
species <- iris %.%
group_by(Species) %.%
summarise(wt = sum(Sepal.Length)) %.%
sample_n(5, replace = T, weight = wt) %.%
select(-wt)
inner_join(species, iris)
Je me demande pourquoi cela a été fermé? Cela semble être une fonctionnalité potentiellement utile
iris %>%
group_by(Species) %>%
sample_n(1)
pour sélectionner toutes les données d'une espèce aléatoire, par exemple
Je ne pense pas que le comportement de sample_n
devrait changer pour les groupes car l'échantillonnage au sein des groupes est son comportement intuitif. Cependant, il est souvent pratique de pouvoir échantillonner des groupes dans leur ensemble. Cela devrait être une deuxième fonction. Voici ma réalisation :
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)
}
L'exemple de @rcorty fonctionne comme prévu
iris %>% group_by(Species) %>% sample_n_groups(1)
+1
Edit : Un changement à dplyr
cassé cette solution ;
Pour ceux d'entre vous qui sont arrivés ici via le moteur de recherche à la recherche de cette fonctionnalité, l'implémentation par @MarcusWalz n'échantillonne pas avec remplacement lorsque replace = TRUE
. L'implémentation doit utiliser right_join
(ou left_join
ou inner_join
) pour conserver les doublons :
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)
}
L'amorçage de cluster est un cas d'utilisation large pour cette fonctionnalité.
@drhagen , dans votre implémentation, avez-vous des suggestions sur la façon de générer un nouvel identifiant de groupe unique ?
En fait, c'est assez simple :
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)
}
La réponse ci-dessus de @drhagen semble être obsolète. Cela semble fonctionner maintenant:
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)
}
Commentaire le plus utile
La réponse ci-dessus de @drhagen semble être obsolète. Cela semble fonctionner maintenant: