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

#r #dplyr #group-by #pipe #summarize

Вопрос:

Примечание: Название этого вопроса было отредактировано, чтобы сделать его каноническим вопросом для проблем, когда 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, поэтому функция 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 %>% 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))
 

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

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 %>% 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