2014-04-02 49 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