dplyr: "n () 'de hata: işlev doğrudan çağrılmamalıdır”


96

Dplyr paketindeki örneklerden birini yeniden oluşturmaya çalışıyorum ama bu hata mesajını alıyorum. Her kombinasyonun sıklığıyla üretilen yeni bir sütun n görmeyi bekliyorum. Neyi kaçırıyorum? Paketin yüklendiğini üç kez kontrol ettim.

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

N () 'de hata: Bu işlev doğrudan çağrılmamalıdır

Yanıtlar:


120

Aynı oturuma sahip olduğunuzu dplyrve plyryüklediğinizi varsayıyorum. dplyrdeğil plyr. paketteki ddplybir işlev değildir dplyr.

Her ikisi de dplyrve / plyrişlevlerine sahiptir .summarisesummarize

conflicts()Maskelenmiş nesneleri görmek için sonuçlarına bakın.


31
Çözüm, plyrönce yüklediğinizden emin olmaktır
— hadley

16
@ User1257894'ün dediği summarizegibi, paketle birlikte kullanın , bunun gibi bir şey dplyr::summarize(count = n()).
— Rafa Barragan

39

Önceki cevapta belirtildiği gibi, plyr ve dplyr arasında bir çelişki olabilir. Plyr paketini kaldırmak için bu komutu çalıştırabilirsiniz.

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

Sonra beklendiği gibi devam edebilirsiniz.

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

Kesinlikle ... çatışma özetle ya da özetle arasındaydı. Ayrıca projemden birinde yanlışlıkla yükledim plyrve dplyrpaketledim ve bu çatışmayı fark ettim. iyi iş arkadaşım
— Manoj Kumar

26

Maskeleme işlevleriyle ilgili karışıklıkları önlemek için, aşağıdaki örnekte olduğu gibi "package :: function" özelliğini kullanmak açıktır:

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

8

Başka bir durumda, bu hata aşağıdaki kodda meydana geldi.

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

Aşağıdaki gibi çözülebilir.

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

Belirtilen bloga göre kod çalıştırılırken benzer bir sorunla karşılaşıldı ve ardından detach'ta çözüm çalıştırıldı ("paket: plyr", boşaltma = DOĞRU)

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
  )

Detach çalıştırma sonrası, yukarıdaki kod yeniden çalıştırıldığında iyi çalıştı, ancak aşağıdaki gibi uyarı mesajı aldı, plyr'in kaldırılıp kaldırılmadığından emin değil.Ve kod nasıl düzgün çalıştırılır?

Uyarı mesajı: 'plyr' ad alanı kaldırılamaz: ad alanı 'plyr', 'reshape2', 'scales', 'broom', 'ggplot2' tarafından içe aktarılır, bu nedenle kaldırılamaz


0

benim için çözüm, detach()bu işlevi aşağı paketini kullandığım işlevdi


"Bu işlevi aşağı paketinden kullandım" derken neyi kastettiğinizi açıklayabilir misiniz?
— Anonim korkak

1
özür dilerim, bir paketi indirmek için detach () işlevini kullandım, dplyr ve knitr paketleri arasında çelişki yaşadım ve ardından paketin ayrılması için işlevi kullandım ("package: knitr", unload = TRUE)
— camilo lopez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.