¿Por qué el resumen o la mutación no funcionan con group_by cuando cargo `plyr` después de` dplyr`?

Nota: El título de esta pregunta ha sido editado para convertirlo en la pregunta canónica para los problemas cuando plyr funciones plyr enmascaran sus contrapartes dplyr . El rest de la pregunta permanece sin cambios.


Supongamos que tengo los siguientes datos:

 dfx <- data.frame( group = c(rep('A', 8), rep('B', 15), rep('C', 6)), sex = sample(c("M", "F"), size = 29, replace = TRUE), age = runif(n = 29, min = 18, max = 54) ) 

Con el buen viejo plyr puedo crear una pequeña tabla que resum mis datos con el siguiente código:

 require(plyr) ddply(dfx, .(group, sex), summarize, mean = round(mean(age), 2), sd = round(sd(age), 2)) 

La salida se ve así:

  group sex mean sd 1 AF 49.68 5.68 2 AM 32.21 6.27 3 BF 31.87 9.80 4 BM 37.54 9.73 5 CF 40.61 15.21 6 CM 36.33 11.33 

Estoy intentando mover mi código a dplyr y al operador %>% . Mi código toma DF, luego lo agrupa por grupo y sexo y luego lo resume. Es decir:

 dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) 

Pero mi resultado es:

  mean sd 1 35.56 9.92 

¿Qué estoy haciendo mal?

El problema aquí es que está cargando dplyr primero y luego plyr, por lo que la función de summarise plyr es enmascarar la función de summarise dplyr. Cuando eso sucede, obtienes esta advertencia:

 require(plyr) Loading required package: plyr ------------------------------------------------------------------------------------------ You have loaded plyr after dplyr - this is likely to cause problems. If you need functions from both plyr and dplyr, please load plyr first, then dplyr: library(plyr); library(dplyr) ------------------------------------------------------------------------------------------ Attaching package: 'plyr' The following objects are masked from 'package:dplyr': arrange, desc, failwith, id, mutate, summarise, summarize 

Por lo tanto, para que su código funcione, desconecte plyr detach detach(package:plyr) o reinicie R y cargue plyr primero y luego dplyr (o cargue solo dplyr):

 library(dplyr) dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) Source: local data frame [6 x 4] Groups: group group sex mean sd 1 AF 41.51 8.24 2 AM 32.23 11.85 3 BF 38.79 11.93 4 BM 31.00 7.92 5 CF 24.97 7.46 6 CM 36.17 9.11 

O puede llamar explícitamente el resumen de dplyr en su código, por lo que se llamará a la función correcta sin importar cómo cargue los paquetes:

 dfx %>% group_by(group, sex) %>% dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) 

Su código llama a plyr::summarise lugar de dplyr::summarise debido al orden en el que ha cargado “plyr” y “dplyr”.

Manifestación:

 library(dplyr) ## I'm guessing this is the order you loaded library(plyr) dfx %>% group_by(group, sex) %>% summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) # mean sd # 1 36.88 9.76 dfx %>% group_by(group, sex) %>% dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) # Source: local data frame [6 x 4] # Groups: group # # group sex mean sd # 1 AF 32.17 6.30 # 2 AM 30.98 7.37 # 3 BF 38.20 7.67 # 4 BM 33.12 12.24 # 5 CF 43.91 10.31 # 6 CM 47.53 8.25