dplyr: "Error in n (): function tidak boleh dipanggil secara langsung"

96

Saya mencoba mereproduksi salah satu contoh dalam paket dplyr tetapi saya mendapatkan pesan kesalahan ini. Saya mengharapkan untuk melihat kolom baru n diproduksi dengan frekuensi setiap kombinasi. Apa yang saya lewatkan? Saya memeriksa tiga kali bahwa paket sudah dimuat.

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

Kesalahan di n (): Fungsi ini tidak boleh dipanggil secara langsung

Michael Bellhouse
sumber

Jawaban:

120

Saya kira Anda telah dplyrdan plyrdimuat dalam sesi yang sama. dplyrtidak plyr. ddplybukan merupakan fungsi dalam dplyrpaket.

Keduanya dplyrdan plyrmemiliki fungsi summarise/ summarize.

Lihat hasil conflicts()untuk melihat objek bertopeng.

mnel
sumber
31
Solusinya adalah memastikan Anda memuat plyrterlebih dahulu
hadley
16
Seperti yang dikatakan @ User1257894, gunakan summarizedengan paket, seperti ini dplyr::summarize(count = n()).
Rafa Barragan
39

Seperti yang disebutkan dalam jawaban sebelumnya, Anda mungkin mengalami konflik antara plyr dan dplyr. Anda dapat menjalankan perintah ini untuk membongkar paket plyr.

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

Kemudian Anda dapat melanjutkan seperti yang diharapkan.

library(dplyr) 
...
summarise(n = n()) 
pengguna2487691
sumber
Persis ... konfliknya antara meringkas atau meringkas. Saya juga tidak sengaja memuat plyrdan dplyrmemaketkan salah satu proyek saya dan menyadari konflik ini. teman kerja yang baik.
Manoj Kumar
26

Untuk menghindari kebingungan dengan fungsi masking, jelas menggunakan spesifikasi "package :: function", seperti contoh di bawah ini:

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

Dalam kasus lain, kesalahan ini terjadi pada kode berikut.

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

Itu bisa diselesaikan sebagai berikut.

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
Keiku
sumber
0

Menghadapi masalah serupa saat menjalankan kode sesuai blog yang disebutkan dan kemudian menjalankan solusi di detach ("package: plyr", unload = TRUE)

Blog: 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
  )

Post running detach, ketika kode di atas dijalankan kembali, itu berfungsi dengan baik meskipun menerima pesan peringatan seperti di bawah ini, tidak yakin apakah plyr dibongkar atau tidak. Dan bagaimana kode dijalankan dengan benar?

Pesan peringatan: namespace 'plyr' tidak dapat dibongkar: namespace 'plyr' diimpor oleh 'reshape2', 'scale', 'broom', 'ggplot2' jadi tidak dapat dibongkar

CuriousCoder
sumber
0

Bagi saya solusinya adalah detach()fungsi saya menggunakan paket fungsi itu

camilo lopez
sumber
Dapatkah Anda menjelaskan apa yang Anda maksud dengan "Saya menggunakan paket fungsi itu"?
Pengecut tanpa nama
1
maaf saya menggunakan fungsi detach () untuk down a package, saya mengalami konflik antara paket dplyr dan knitr kemudian menggunakan fungsi untuk down package detach ("package: knitr", unload = TRUE)
camilo lopez