dplyr: "Lỗi trong n (): hàm không nên được gọi trực tiếp"


96

Tôi đang cố gắng tạo lại một trong các ví dụ trong gói dplyr nhưng nhận được thông báo lỗi này. Tôi đang mong đợi để xem một cột n mới được tạo ra với tần suất của mỗi kết hợp. Tôi đang thiếu gì? Tôi đã kiểm tra ba lần xem gói đã được tải chưa.

 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())

Lỗi trong n (): Hàm này không nên được gọi trực tiếp

Câu trả lời:


120

Tôi cho rằng bạn có dplyrplyrtải trong cùng một phiên. dplyrkhông plyr. ddplykhông phải là một chức năng trong dplyrgói.

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

Nhìn vào kết quả của conflicts()để xem các đối tượng bị che.


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

16
Như @ User1257894 nói, hãy sử dụng summarizevới gói, một cái gì đó như thế này dplyr::summarize(count = n()).
Rafa Barragan

39

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()) 

Chính xác là ... xung đột giữa tóm tắt hoặc tóm tắt. Tôi cũng vô tình tải plyrdplyrđóng gói trong một dự án của mình và nhận ra xung đột này. bạn làm việc tốt.
Manoj Kumar

26

Để tránh nhầm lẫn với các hàm che, rõ ràng là sử dụng đặc tả "package :: function", 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))

8

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

0

Đối mặt với vấn đề tương tự trong khi thực thi mã theo blog đã đề cập và sau đó chạy giải pháp trong tách ("package: plyr", dỡ bỏ = TRUE)

Blog: https://www.analyticsvidhya.com/blog/2017/09/comp so-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
  )

Đăng chạy bộ tách, khi mã trên được chạy lại, nó hoạt động tốt mặc dù nhận được thông báo cảnh báo như bên dưới, không chắc chắn liệu plyr có được tải xuống hay không. Và mã được thực thi đúng cách như thế nào?

Thông báo cảnh báo: Không thể tải không gian tên 'plyr': không gian tên 'plyr' được nhập bởi 'reshape2', 'scale', 'broom', 'ggplot2' nên không thể tải xuống


0

đối với tôi, giải pháp là detach()chức năng mà tôi đã sử dụng gói chức năng đó


Bạn có thể làm rõ ý của bạn bằng cách "Tôi đã sử dụng chức năng đó xuống gói" không?
Kẻ hèn nhát ẩn danh

1
xin lỗi, tôi đã sử dụng hàm detach () để gỡ một gói, tôi có xung đột giữa các gói dplyr và huntertr sau đó sử dụng hàm để gỡ gói xuống ("package: precisiontr", loading = TRUE)
camilo lopez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.