2014-04-02 14 views
75

Sto tentando di riprodurre uno degli esempi nel pacchetto dplyr ma questo messaggio di errore. Mi aspetto di vedere una nuova colonna n prodotta con la frequenza di ciascuna combinazione. Qualcuno può dirmi cosa mi manca? Ho controllato tre volte che il pacchetto è stato caricato. Grazie per l'aiuto, come sempre.dplyr: "Errore n(): la funzione non dovrebbe essere chiamato direttamente"

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

#Error in n() : This function should not be called directly 

risposta

97

Presumo avete dplyr e plyr caricato nella stessa sessione. dplyr non è plyr. ddply non è una funzione nel pacchetto dplyr.

Sia dplyr e plyr hanno le funzioni summarise/summarize.

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

+26

La soluzione è quello di assicurarsi di caricare 'plyr' primo – hadley

+8

Come @ User1257894 dice, utilizzare' summarize' con il pacchetto, qualcosa di simile 'dplyr :: riassumere (count = n())'. –

26

Come accennato dalla risposta precedente, si può avere un conflitto tra plyr e dplyr. È possibile eseguire questo comando per scaricare il pacchetto plyr.

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

Poi si può continuare come previsto.

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

Esattamente ... Il conflitto è stato tra i Riassumere o riassumere. Ho anche caricato accidentalmente pacchetti 'plyr' e' dplyr' in uno dei miei progetti e ho realizzato questo conflitto. Bel compagno di lavoro. –

21

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

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

Bel trucco! –

4

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

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