una todas studio menos las datos columnas agrupar r dplyr

todas - group by en r



¿Cómo agrupar por todas las columnas menos una? (3)

¿Cómo le digo a group_by que group_by los datos por todas las columnas excepto una dada?

Con el aggregate , sería aggregate(x ~ ., ...) .

Intenté group_by(data, -x) , pero eso se agrupa por el negativo de x (es decir, lo mismo que agrupar por x).


Puedes hacer esto usando una evaluación estándar ( group_by_ lugar de group_by ):

# Fake data set.seed(492) dat = data.frame(value=rnorm(1000), g1=sample(LETTERS,1000,replace=TRUE), g2=sample(letters,1000,replace=TRUE), g3=sample(1:10, replace=TRUE), other=sample(c("red","green","black"),1000,replace=TRUE)) dat %>% group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>% summarise(meanValue=mean(value))

g1 g2 g3 other meanValue <fctr> <fctr> <int> <fctr> <dbl> 1 A a 2 green 0.89281475 2 A b 2 red -0.03558775 3 A b 5 black -1.79184218 4 A c 10 black 0.17518610 5 A e 5 black 0.25830392 ...

Vea esta viñeta para obtener más información sobre la evaluación estándar frente a la no estándar en dplyr .

ACTUALIZACIÓN para dplyr 0.7.0

Para abordar el comentario de @ ÖmerAn: Parece que group_by_at es el camino a seguir en dplyr 0.7.0 (alguien me corrige si me equivoco al respecto). Por ejemplo:

dat %>% group_by_at(names(dat)[-grep("value", names(dat))]) %>% summarise(meanValue=mean(value))

# Groups: g1, g2, g3 [?] g1 g2 g3 other meanValue <fctr> <fctr> <int> <fctr> <dbl> 1 A a 2 green 0.89281475 2 A b 2 red -0.03558775 3 A b 5 black -1.79184218 4 A c 10 black 0.17518610 5 A e 5 black 0.25830392 6 A e 5 red -0.81879788 7 A e 7 green 0.30836054 8 A f 2 green 0.05537047 9 A g 1 black 1.00156405 10 A g 10 black 1.26884303 # ... with 949 more rows

Confirmemos que ambos métodos dan el mismo resultado (en dplyr 0.7.0):

new = dat %>% group_by_at(names(dat)[-grep("value", names(dat))]) %>% summarise(meanValue=mean(value)) old = dat %>% group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>% summarise(meanValue=mean(value)) identical(old, new) # [1] TRUE


Sobre la base de la edición 0.7.0 de @ eipi10, group_by_at parece ser la función correcta para este trabajo. Sin embargo, si simplemente busca omitir la columna "x", puede usar:

new2.0 <- dat %>% group_by_at(vars(-x)) %>% summarize(mean_value = mean(value))

Usando los datos de ejemplo de @ eipi10:

# Fake data set.seed(492) dat <- data.frame(value = rnorm(1000), g1 = sample(LETTERS, 1000, replace = TRUE), g2 = sample(letters, 1000, replace = TRUE), g3 = sample(1:10, replace = TRUE), other = sample(c("red", "green", "black"), 1000, replace = TRUE)) new <- dat %>% group_by_at(names(dat)[-grep("value", names(dat))]) %>% summarise(meanValue = mean(value)) new2.0 <- dat %>% group_by_at(vars(-value)) %>% summarize(meanValue = mean(value)) identical(new, new2.0) # [1] TRUE


Una pequeña actualización sobre esta pregunta porque me topé con esto y encontré una solución elegante con la versión actual de dplyr (0.7.4): Dentro de group_by_at() , puede proporcionar los nombres de las columnas de la misma manera que en la función select() utilizando vars() . Esto nos permite agruparnos por todo menos una columna ( hp en este ejemplo) escribiendo:

library(dplyr) df <- as_tibble(mtcars, rownames = "car") df %>% group_by_at(vars(-hp))