dplyr: "Errore in n (): la funzione non deve essere chiamata direttamente"


96

Sto tentando di riprodurre uno degli esempi nel pacchetto dplyr ma ricevo questo messaggio di errore. Mi aspetto di vedere una nuova colonna n prodotta con la frequenza di ciascuna combinazione. Cosa mi manca? Ho controllato tre volte che il pacchetto sia caricato.

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

Errore in n (): questa funzione non deve essere chiamata direttamente

Risposte:


120

Presumo che tu abbia dplyre plyrcaricato nella stessa sessione. dplyrnon lo è plyr. ddplynon è una funzione indplyr pacchetto.

Entrambi dplyre plyrhanno le funzioni summarise/ summarize.

Guarda i risultati di conflicts()per vedere oggetti mascherati.


31
La soluzione è assicurarsi di caricare per plyrprimo
hadley

16
Come dice @ User1257894, usa summarizecon il pacchetto qualcosa di simile dplyr::summarize(count = n()).
Rafa Barragan

39

Come accennato nella risposta precedente, potresti avere un conflitto tra plyr e dplyr. È possibile eseguire questo comando per scaricare il pacchetto plyr.

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

Quindi puoi continuare come previsto.

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

Esatto ... il conflitto era tra riassumere o riassumere. Ho anche caricato accidentalmente plyre dplyrpacchetti in uno dei miei progetti e ho realizzato questo conflitto. bel lavoro amico.
Manoj Kumar

26

Per evitare confusioni con le funzioni di mascheramento, è chiaro utilizzare la specifica "pacchetto :: funzione", come nell'esempio seguente:

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

8

In un altro caso, questo errore si è verificato nel codice seguente.

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

Può essere risolto come segue.

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

È stato riscontrato un problema simile durante l'esecuzione del codice come da blog menzionato e quindi eseguire la soluzione in 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
  )

Dopo aver eseguito il distacco, quando il codice sopra è stato rieseguito ha funzionato bene anche se ha ricevuto un messaggio di avviso come di seguito, non sono sicuro che plyr sia stato scaricato o meno. E come viene eseguito correttamente il codice?

Messaggio di avviso: impossibile scaricare lo spazio dei nomi "plyr": lo spazio dei nomi "plyr" viene importato da "reshape2", "scales", "broom", "ggplot2", quindi non può essere scaricato


0

per me la soluzione era la detach()funzione che utilizzavo quel pacchetto funzione giù


Puoi chiarire cosa intendi con "Ho utilizzato quella funzione down package"?
Anonimo codardo,

1
scusa se ho usato la funzione detach () per il down di un pacchetto, ho avuto il conflitto tra i pacchetti dplyr e knitr quindi ho usato la funzione per il down package detach ("package: knitr", unload = TRUE)
camilo lopez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.