2014-04-02 53 views
75

我试图复制在dplyr包的一个例子,但该错误消息。我期待看到每个组合的频率产生的新列n。有人能告诉我我错过了什么吗?我三重检查了包是否已加载。感谢您的帮助,一如既往。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()) 

#Error in n() : This function should not be called directly 

回答

97

我推测你已经在同一个会话中加载了dplyrplyrdplyr不是plyrddply不在dplyr包的功能。

dplyrplyr都具有功能summarise/summarize

看的conflicts()结果看到被遮罩对象。

+26

解决的办法是,以确保您加载'plyr'第一 – hadley

+8

正如@ User1257894说,使用'summarize'与包装,像这样'dplyr ::总结(计数= N())'。 –

26

正如先前的答复中提到,你可能有plyr和dplyr之间的冲突。您可以运行此命令来卸载plyr软件包。

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

然后您可以按预期继续。

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

没错...冲突是总结或归纳之间。我也意外地在我的一个项目中加载了'plyr'和'dplyr'软件包,并意识到这种冲突。漂亮的工作伴侣。 –

21

为了避免与掩蔽功能混乱,显然要使用“包::功能”规范,如下面的例子:

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

不错的解决方法! –

4

在另一情况下,在下面的代码发生该错误。

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