Dplyr: Besoin de pouvoir échantillonner des groupes

Créé le 28 mars 2014  ·  9Commentaires  ·  Source: tidyverse/dplyr

Ainsi que des individus au sein de groupes

Commentaire le plus utile

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)
}

Tous les 9 commentaires

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)
}
Cette page vous a été utile?
0 / 5 - 0 notes