2014-04-02 15 views
75

Tôi đang cố tạo lại một trong các ví dụ trong gói dplyr nhưng thông báo lỗi này. Tôi hy vọng sẽ thấy một cột mới n được tạo ra với tần suất của mỗi kết hợp. Ai đó có thể cho tôi biết tôi đang thiếu gì không? Tôi ba kiểm tra xem gói có được tải không. Cảm ơn sự giúp đỡ, như mọi khi.dplyr: "Lỗi trong n(): không nên gọi trực tiếp chức năng"

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 

Trả lời

97

Tôi giả sử bạn có dplyrplyr được tải trong cùng một phiên. dplyr không phải là plyr. ddply không phải là một chức năng trong gói dplyr.

Cả hai dplyrplyr có các chức năng summarise/summarize.

Xem kết quả của conflicts() để xem các đối tượng bị che khuất.

+26

Giải pháp là để đảm bảo bạn nạp 'plyr' đầu tiên – hadley

+8

Như @ User1257894 nói, sử dụng 'summarize' với gói, một cái gì đó như thế này' dplyr :: tóm tắt (count = n())'. –

26

Như đã đề cập trong câu trả lời trước, bạn có thể có xung đột giữa plyr và dplyr. Bạn có thể chạy lệnh này để dỡ gói plyr.

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

Sau đó, bạn có thể tiếp tục như mong đợi.

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

Chính xác ... xung đột giữa tóm tắt hoặc tóm tắt. Tôi cũng vô tình nạp các gói 'plyr' và' dplyr' vào một trong các dự án của tôi và nhận ra xung đột này. người bạn đời tốt đẹp. –

21

Để tránh nhầm lẫn với các chức năng tạo mặt nạ, nó là rõ ràng để sử dụng "gói :: chức năng" đặc điểm kỹ thuật, giống như ví dụ dưới đây:

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

Giải pháp tốt! –

4

Trong một trường hợp khác, lỗi này xảy ra trong đoạn mã sau .

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 

Nó có thể được giải quyết như sau.

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 
Các vấn đề liên quan