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.