dplyr: «Ошибка в n (): функцию нельзя вызывать напрямую»


96

Я пытаюсь воспроизвести один из примеров из пакета dplyr, но получаю это сообщение об ошибке. Я ожидаю увидеть новый столбец n с частотой каждой комбинации. Что мне не хватает? Я трижды проверил, что пакет загружен.

 library(dplyr)
# summarise peels off a single layer of grouping
by_vs_am <- group_by(mtcars, vs, am)

by_vs <- summarise(by_vs_am, n = n())

Ошибка в n (): эту функцию нельзя вызывать напрямую

Ответы:


120

Я предполагаю, что у вас есть dplyrи plyrзагружается в одном сеансе. dplyrнет plyr. ddplyне является функцией dplyrпакета.

Оба dplyrи plyrимеют функции summarise/ summarize.

Посмотрите на результаты, conflicts()чтобы увидеть замаскированные объекты.


31
Решение состоит в том, чтобы убедиться, что вы загружаетесь plyrпервым
Хэдли

16
Как говорит @ User1257894, используйте summarizeс пакетом что-то вроде этого dplyr::summarize(count = n()).
Рафа Барраган

39

Как упоминалось в предыдущем ответе, у вас может быть конфликт между plyr и dplyr. Вы можете запустить эту команду, чтобы выгрузить пакет plyr.

detach("package:plyr", unload=TRUE) 

Затем вы можете продолжить, как и ожидалось.

library(dplyr) 
...
summarise(n = n()) 

Точно ... конфликт был между резюмировать или резюмировать. Я также случайно загружен plyrи dplyrпакеты в одном из моих проектов и понял , этот конфликт. хороший помощник по работе.
Манодж Кумар

26

Чтобы избежать путаницы с функциями маскирования, ясно использовать спецификацию "package :: function", как в примере ниже:

delay <- dplyr::summarise(by_tailnum, 
  count = n(), 
  dist = mean(distance, na.rm = TRUE), 
  delay = mean(arr_delay, na.rm = TRUE))

8

В другом случае эта ошибка возникла в следующем коде.

library(dplyr) # dplyr 0.5.0
library(lazyeval)

df <- data_frame(group = c(1, 2, 2, 3, 3, 3))

g <- "group"

df %>%
  group_by_(g) %>%
  summarise_(
    n = n(),
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# Error in n() : This function should not be called directly

Ее можно решить следующим образом.

df %>%
  group_by_(g) %>%
  summarise_(
    n = "n()",
    sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
  )
# A tibble: 3 × 3
# group     n   sum
# <dbl> <int> <dbl>
# 1     1     1     1
# 2     2     2     4
# 3     3     3     9

0

Столкнулся с аналогичной проблемой при выполнении кода в соответствии с упомянутым блогом и последующем запуске решения в отсоединении ("package: plyr", unload = TRUE)

Блог: https://www.analyticsvidhya.com/blog/2017/09/comparative-stock-analysis/

Master_Data_AutoCorrelations<-Master_Data_lags %>%
  gather(key = "lag", value = "lag_value", -c(Stock,Date, Close)) %>%
  mutate(lag = str_sub(lag, start = 5) %>% as.numeric) %>%
  group_by(Stock, lag) %>%
  summarize(
    cor = cor(x = Close, y = lag_value, use = "pairwise.complete.obs"),
    cutoff_upper = 2/(n())^0.5,
    cutoff_lower = -2/(n())^0.5
  )

После выполнения отсоединения, когда приведенный выше код был повторно запущен, он работал нормально, хотя получил предупреждающее сообщение, как показано ниже, не уверен, выгружен ли plyr или нет.

Предупреждающее сообщение: пространство имен 'plyr' не может быть выгружено: пространство имен 'plyr' импортировано 'reshape2', 'scale', 'broom', 'ggplot2', поэтому не может быть выгружено


0

для меня решением была detach()функция, которую я использовал, эту функцию в пакете


Не могли бы вы пояснить, что вы имеете в виду, говоря «Я использовал эту функцию без пакета»?
Анонимный трус

1
извините, я использовал функцию detach () для удаления пакета, у меня был конфликт между пакетами dplyr и knitr, затем используйте функцию для удаления пакета вниз ("package: knitr", unload = TRUE)
camilo lopez
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.