Dplyr: Necesita poder muestrear grupos

Creado en 28 mar. 2014  ·  9Comentarios  ·  Fuente: tidyverse/dplyr

Así como individuos dentro de grupos

Comentario más útil

La respuesta anterior de @drhagen parece obsoleta. Esto parece funcionar ahora:

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

Todos 9 comentarios

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

inner_join(species, iris)

Me pregunto por qué se cerró esto. Parece una característica potencialmente útil

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

para seleccionar todos los datos de una especie aleatoria, p. ej.

No creo que el comportamiento de sample_n deba cambiar para los grupos porque el muestreo dentro de los grupos es su comportamiento intuitivo. Sin embargo, a menudo es útil poder muestrear grupos como un todo. Esta debería ser una segunda función. Aquí está mi implementación:

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

El ejemplo de @rcorty funciona como se esperaba

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

+1

Editar: Un cambio a dplyr rompió esta solución;


Para aquellos de ustedes que llegaron aquí a través de un motor de búsqueda en busca de esta funcionalidad, la implementación de @MarcusWalz no muestra con reemplazo cuando replace = TRUE . La implementación necesita usar right_join (o left_join o inner_join ) para mantener los duplicados:

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

El arranque de clúster es un caso de uso amplio para esta función.

@drhagen , en su implementación, ¿tiene alguna sugerencia sobre cómo generar una nueva identificación de grupo única?

De hecho, esto es bastante sencillo:

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 respuesta anterior de @drhagen parece obsoleta. Esto parece funcionar ahora:

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)
}
¿Fue útil esta página
0 / 5 - 0 calificaciones