dplyr: "Fehler in n (): Funktion sollte nicht direkt aufgerufen werden"

96

Ich versuche, eines der Beispiele im dplyr-Paket zu reproduzieren, erhalte jedoch diese Fehlermeldung. Ich erwarte eine neue Spalte n, die mit der Häufigkeit jeder Kombination erstellt wird. Was vermisse ich? Ich habe dreimal überprüft, ob das Paket geladen ist.

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

Fehler in n (): Diese Funktion sollte nicht direkt aufgerufen werden

Michael Bellhouse
quelle

Antworten:

120

Ich nehme an, Sie haben dplyrund plyrin derselben Sitzung geladen. dplyrist nicht plyr. ddplyist keine Funktion im dplyrPaket.

Beide dplyrund plyrhaben die Funktionen summarise/ summarize.

Schauen Sie sich die Ergebnisse von conflicts()an, um maskierte Objekte zu sehen.

mnel
quelle
31
Die Lösung besteht darin, sicherzustellen, dass Sie plyrzuerst laden
Hadley
16
Wie @ User1257894 sagt, verwenden Sie summarizemit dem Paket so etwas dplyr::summarize(count = n()).
Rafa Barragan
39

Wie in der vorherigen Antwort erwähnt, besteht möglicherweise ein Konflikt zwischen plyr und dplyr. Sie können diesen Befehl ausführen, um das Plyr-Paket zu entladen.

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

Dann können Sie wie erwartet fortfahren.

library(dplyr) 
...
summarise(n = n()) 
user2487691
quelle
Genau ... der Konflikt war zwischen zusammenfassen oder zusammenfassen. Ich habe auch versehentlich eines meiner Projekte geladen plyrund dplyrverpackt und diesen Konflikt erkannt. netter Arbeitskollege.
Manoj Kumar
26

Um Verwechslungen mit Maskierungsfunktionen zu vermeiden, ist es klar, die Spezifikation "package :: function" zu verwenden, wie im folgenden Beispiel:

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

In einem anderen Fall trat dieser Fehler im folgenden Code auf.

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

Es kann wie folgt gelöst werden.

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
quelle
0

Beim Ausführen von Code wie im genannten Blog wurde ein ähnliches Problem festgestellt, und anschließend wurde die Lösung in separate ausgeführt ("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
  )

Nach dem Ausführen wurde der obige Code erneut ausgeführt. Wenn der obige Code erneut ausgeführt wurde, funktionierte er einwandfrei, obwohl eine Warnmeldung wie unten angegeben empfangen wurde. Sie sind sich nicht sicher, ob plyr entladen wurde oder nicht. Und wie wird der Code ordnungsgemäß ausgeführt?

Warnmeldung: Der Namespace 'plyr' kann nicht entladen werden: Der Namespace 'plyr' wird von 'reshape2', 'scale', 'broom', 'ggplot2' importiert und kann daher nicht entladen werden

CuriousCoder
quelle
0

Für mich war die Lösung die detach()Funktion, die ich für dieses Funktions-Down-Paket verwendet habe

camilo lopez
quelle
Können Sie klarstellen, was Sie unter "Ich habe dieses Funktions-Down-Paket verwendet" verstehen?
Anonymer Feigling
1
leider habe ich die Funktion detach () für ein Paket nach unten hatte ich den Konflikt zwischen den Paketen dplyr und knitr dann Funktion für detach unten Paket verwenden ( „Paket: knitr“, Entladen = TRUE)
camilo lopez