summarise data and r dplyr plyr r-faq

data - sum by group in r



¿Por qué resumir o mutar no funciona con group_by cuando carga `plyr` después de` dplyr`? (2)

Nota: El título de esta pregunta se ha editado para que sea la pregunta canónica para problemas cuando plyr funciones plyr enmascaran a sus contrapartes dplyr . El resto 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 resume 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 A F 49.68 5.68 2 A M 32.21 6.27 3 B F 31.87 9.80 4 B M 37.54 9.73 5 C F 40.61 15.21 6 C M 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 salida es:

mean sd 1 35.56 9.92

¿Qué estoy haciendo mal?


El problema aquí es que primero está cargando dplyr y luego plyr, así que el resumen de la función de plyr es el enmascaramiento del summarise la función de dplyr. Cuando eso sucede recibes 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

Entonces, para que su código funcione, separe 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 A F 41.51 8.24 2 A M 32.23 11.85 3 B F 38.79 11.93 4 B M 31.00 7.92 5 C F 24.97 7.46 6 C M 36.17 9.11

O puede llamar explícitamente al 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 está llamando a plyr::summarise lugar de a 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 A F 32.17 6.30 # 2 A M 30.98 7.37 # 3 B F 38.20 7.67 # 4 B M 33.12 12.24 # 5 C F 43.91 10.31 # 6 C M 47.53 8.25