dplyr:"Error in n():该函数不应直接调用"

101

我尝试在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() 中发生错误:此函数不应直接调用

6个回答

120

我假设你已经在同一个会话中加载了 dplyrplyrdplyr 不是 plyrddply 不是 dplyr 包中的函数。

无论是 dplyr 还是 plyr 都有函数 summarise/summarize

使用 conflicts() 查看被屏蔽的对象。


31
解决方案是确保首先加载 plyr - hadley
16
如@User1257894所说,使用该包中的summarize函数,类似于这样:dplyr::summarize(count = n()) - Rafa Barragan

39

如前面的答案所提到的,可能会存在 plyr 和 dplyr 之间的冲突。您可以运行此命令来卸载 plyr 包。

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

那么您可以按预期继续操作。

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

没错...冲突是在summarise或summarize之间。我也不小心在我的一个项目中同时加载了plyrdplyr包,意识到了这个冲突。干得好,伙计。 - Manoj Kumar

26
为了避免掩码函数的混淆,使用"package::function"说明更加清晰。如下例所示:

"为了避免掩码函数的混淆,使用"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()函数,我在代码包中使用了该函数。


你能澄清一下你所说的“我在该包中使用了那个函数”是什么意思吗? - Anonymous coward
1
抱歉,我在下载一个包时使用了detach()函数,但是dplyr和knitr两个包之间发生了冲突,因此我使用了detach("package:knitr", unload=TRUE)函数来卸载knitr包。 - camilo lopez

0

在按照提到的博客执行代码时遇到了类似的问题,然后在detach("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
  )

在运行detach之后,当上述代码重新运行时,它能够正常工作,但是会收到如下警告信息,不确定plyr是否已经被卸载。代码如何正确执行?

警告信息: “plyr”命名空间无法卸载: 命名空间“plyr”被“reshape2”、“scales”、“broom”、“ggplot2”导入,因此无法卸载


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接