Почему суммировать или мутировать не работают, когда я загружаю `plyr` после` dplyr`?
Примечание. Заголовок этого вопроса был отредактирован, чтобы сделать его каноническим вопросом для проблем, когда функции plyr
маскируют свои копии dplyr
. Остальная часть вопроса остается неизменной.
Предположим, что у меня есть следующие данные:
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)
)
С добрым старым plyr
я могу создать небольшую таблицу, суммирующую мои данные со следующим кодом:
require(plyr)
ddply(dfx, .(group, sex), summarize,
mean = round(mean(age), 2),
sd = round(sd(age), 2))
Результат выглядит следующим образом:
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
Я пытаюсь переместить мой код в dplyr
и %>%
. Мой код принимает DF, затем группирует его по группе и полу, а затем суммирует его. То есть:
dfx %>% group_by(group, sex) %>%
summarise(mean = round(mean(age), 2), sd = round(sd(age), 2))
Но мой вывод:
mean sd
1 35.56 9.92
Что я делаю неправильно?
Спасибо!
Ответы
Ответ 1
Проблема заключается в том, что вы сначала загружаете dplyr, а затем plyr, поэтому функция plyr summarise
маскирует функцию dplyr summarise
. Когда это произойдет, вы получите следующее предупреждение:
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
Итак, чтобы ваш код работал, отделите plyr detach(package:plyr)
или перезапустите R и сначала загрузите plyr, а затем dplyr (или загрузите только 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
Или вы можете явно называть dplyr суммировать в своем коде, поэтому правильная функция будет вызвана независимо от того, как вы загружаете пакеты:
dfx %>% group_by(group, sex) %>%
dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2))
Ответ 2
Ваш код вызывает plyr::summarise
вместо dplyr::summarise
из-за того, что вы загрузили "plyr" и "dplyr".
Демо:
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