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першим
hadley

16
Як каже @ User1257894, використовуйте summarizeразом із пакетом щось подібне dplyr::summarize(count = n()).
Рафа Барраган

39

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

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

Тоді ви можете продовжувати, як очікувалося.

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

Точно ... конфлікт був між узагальненням або узагальненням. Я також випадково завантажений plyrі dplyrпакети в одному з моїх проектів і зрозумів , цей конфлікт. хороший колега.
Manoj Kumar

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

Зіткнулася з подібною проблемою під час виконання коду, як зазначено у згаданому блозі, а потім запустити рішення в detach ("пакет: plyr", вивантажити = 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", "ваги", "мітла", "ggplot2", тому не може бути вивантажений


0

для мене рішенням була detach()функція, яку я використав для цієї функції


Чи можете ви пояснити, що ви маєте на увазі під "я використав цю функцію вниз пакет"?
Анонімний боягуз

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