Así como individuos dentro de grupos
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)
}
Comentario más útil
La respuesta anterior de @drhagen parece obsoleta. Esto parece funcionar ahora: