Почему суммирование или изменение не работает с group_by, когда я загружаю «plyr» после «dplyr»?

#r #dataframe #dplyr

Вопрос:

Примечание: Название этого вопроса было отредактировано, чтобы сделать его каноническим вопросом для проблем, когда plyr функции маскируют свои dplyr аналоги. Остальная часть вопроса остается неизменной.


Предположим, у меня есть следующие данные:

 dfx lt;- 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 и %gt;% оператора. Мой код принимает DF, затем группирует его по группам и полу, а затем суммирует его. То есть:

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

Но мой результат таков:

 mean sd 1 35.56 9.92  

Что я делаю не так?

Ответ №1:

Проблема здесь в том, что вы сначала загружаете dplyr, а затем plyr, поэтому функция summarise plyr маскирует функцию summarise dplyr . Когда это произойдет, вы получите это предупреждение:

 library(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 %gt;% group_by(group, sex) %gt;%   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 %gt;% group_by(group, sex) %gt;%   dplyr::summarise(mean = round(mean(age), 2), sd = round(sd(age), 2))  

Комментарии:

1. Я не понимаю, почему так мало людей замечают это предупреждение :/

2. @хэдли fortunes::fortune(9)

Ответ №2:

Ваш код вызывает plyr::summarise вместо из dplyr::summarise -за порядка, в котором вы загрузили «plyr» и «dplyr».

ДЕМОНСТРАЦИЯ:

 library(dplyr) ## I'm guessing this is the order you loaded library(plyr) dfx %gt;% group_by(group, sex) %gt;%   summarise(mean = round(mean(age), 2), sd = round(sd(age), 2)) # mean sd # 1 36.88 9.76 dfx %gt;% group_by(group, sex) %gt;%   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