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

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.


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

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

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

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


0

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.