summarise r group-by dplyr compound-key

summarise - dplyr problemas al usar group_by(mĂșltiples variables)



summarise r (5)

Llevando la respuesta de Dickoa un paso más allá, como dice Hadley, "resumir peelings de una sola capa de agrupación". Pela la agrupación desde el orden inverso al que la aplicó para que pueda usar

mtcars %>% group_by(cyl, gear) %>% summarise(newvar = sum(wt)) %>% summarise(newvar2 = sum(newvar) + 5)

Tenga en cuenta que esto dará una respuesta diferente si usa group_by(gear, cyl) en la segunda línea.

Y para obtener su primer intento de trabajo:

df1 <- mtcars %>% group_by(cyl, gear) %>% summarise(newvar = sum(wt)) df2 <- df1 %>% group_by(cyl) %>% summarise(newvar2 = sum(newvar)+5)

Quiero comenzar a usar dplyr en lugar de ddply, pero no puedo entender cómo funciona (he leído la documentación).

Por ejemplo, ¿por qué cuando trato de mutar () algo la función "group_by" no funciona como debería?

Mirando mtcars:

biblioteca (coche)

Digamos que hago un data.frame que es un resumen de mtcars, agrupado por "cyl" y "gear":

df1 <- mtcars %.% group_by(cyl, gear) %.% summarise( newvar = sum(wt) )

Luego di que quiero resumir aún más este marco de datos. Con ddply, sería sencillo, pero cuando trato de hacerlo con dplyr, en realidad no es "agrupar por":

df2 <- df1 %.% group_by(cyl) %.% mutate( newvar2 = newvar + 5 )

Aún produce un resultado no agrupado:

cyl gear newvar newvar2 1 6 3 6.675 11.675 2 4 4 19.025 24.025 3 6 4 12.375 17.375 4 6 5 2.770 7.770 5 4 3 2.465 7.465 6 8 3 49.249 54.249 7 4 5 3.653 8.653 8 8 5 6.740 11.740

¿Estoy haciendo algo mal con la sintaxis?

Editar:

Si tuviera que hacer esto con plyr y ddply:

df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt))

y luego para obtener el segundo df:

df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5)

Pero ese mismo enfoque, con sum (newvar) + 5 en la función summarize () no funciona con dplyr ...


Si plyr tu código plyr a dplyr usando summarise lugar de dplyr obtienes los mismos resultados.

library(plyr) df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5) df2 ## cyl newvar2 ## 1 4 30.143 ## 2 6 26.820 ## 3 8 60.989 detach(package:plyr) library(dplyr) mtcars %.% group_by(cyl, gear) %.% summarise(newvar = sum(wt)) %.% group_by(cyl) %.% summarise(newvar2 = sum(newvar) + 5) ## cyl newvar2 ## 1 4 30.143 ## 2 8 60.989 ## 3 6 26.820

EDITAR

Como summarise descarta el último grupo ( gear ), puede omitir el segundo group_by (consulte @hadley comentario a continuación)

library(dplyr) mtcars %.% group_by(cyl, gear) %.% summarise(newvar = sum(wt)) %.% summarise(newvar2 = sum(newvar) + 5) ## cyl newvar2 ## 1 4 30.143 ## 2 8 60.989 ## 3 6 26.820


Tuve un problema similar. Descubrí que, simplemente, separar el plyr resolvía:

detach(package:plyr) library(dplyr)


dplyr está funcionando como debería esperar en su ejemplo. Mutate, como lo especificó, solo agregará 5 a cada valor de newvar, ya que crea newvar2. Esto se vería igual si agrupas o no. Sin embargo, si especifica algo que difiere según el grupo, obtendrá algo diferente. Por ejemplo:

df1 %.% group_by(cyl) %.% mutate( newvar2 = newvar + mean(cyl) )


plyr es una forma de resolver el problema, de modo que puede usar dplyr funciones dplyr como desee ... pero, ¿qué plyr si necesita otras funciones de plyr para completar otras tareas en su código?

(En este ejemplo, tengo dplyr plyr bibliotecas dplyr y plyr )

Supongamos que tenemos un data.frame simple y queremos calcular la suma groupwise del value de la variable, cuando se agrupan por diferentes niveles de gname

> dx<-data.frame(gname=c(1,1,1,2,2,2,3,3,3), value = c(2,2,2,4,4,4,5,6,7)) > dx gname value 1 1 2 2 1 2 3 1 2 4 2 4 5 2 4 6 2 4 7 3 5 8 3 6 9 3 7

Pero cuando intentamos usar lo que creemos que producirá una suma agrupada de dplyr , esto es lo que sucede:

dx %>% group_by(gname) %>% mutate(mysum=sum(value)) Source: local data frame [9 x 3] Groups: gname gname value mysum 1 1 2 36 2 1 2 36 3 1 2 36 4 2 4 36 5 2 4 36 6 2 4 36 7 3 5 36 8 3 6 36 9 3 7 36

No nos da la respuesta deseada. Probablemente debido a alguna interacción o sobrecarga de las funciones dplyr y plyr entre dplyr y plyr . Podríamos separar plyr , pero otra forma es dar una llamada única a las versiones group_by de group_by y group_by :

dx %>% dplyr::group_by(gname) %>% dplyr::mutate(mysum=sum(value)) Source: local data frame [9 x 3] Groups: gname gname value mysum 1 1 2 6 2 1 2 6 3 1 2 6 4 2 4 12 5 2 4 12 6 2 4 12 7 3 5 18 8 3 6 18 9 3 7 18

ahora vemos que esto funciona como se esperaba.