dplyr: „Błąd w n (): funkcja nie powinna być wywoływana bezpośrednio”


96

Próbuję odtworzyć jeden z przykładów w pakiecie dplyr, ale pojawia się ten komunikat o błędzie. Spodziewam się, że nowa kolumna n będzie tworzona z częstotliwością każdej kombinacji. czego mi brakuje? Trzykrotnie sprawdziłem, czy pakiet jest załadowany.

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

Błąd w n (): tej funkcji nie należy wywoływać bezpośrednio

Odpowiedzi:


120

Zakładam, że masz dplyri plyrzaładowałeś w tej samej sesji. dplyrnie jest plyr. ddplynie jest funkcją w dplyrpakiecie.

Obie dplyri plyrmają funkcje summarise/ summarize.

Spójrz na wyniki, conflicts()aby zobaczyć zamaskowane obiekty.


31
Rozwiązaniem jest upewnienie się, że plyr
ładujesz

16
Jak mówi @ User1257894, użyj summarizez pakietem czegoś takiego dplyr::summarize(count = n()).
Rafa Barragan

39

Jak wspomniano w poprzedniej odpowiedzi, możesz mieć konflikt między plyr i dplyr. Możesz uruchomić to polecenie, aby zwolnić pakiet plyr.

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

Następnie możesz kontynuować zgodnie z oczekiwaniami.

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

Dokładnie ... konflikt był pomiędzy podsumowaniem lub podsumowaniem. Również przypadkowo załadowałem plyri dplyrpaczki w jednym z moich projektów i zdałem sobie sprawę z tego konfliktu. miły kolega z pracy.
Manoj Kumar

26

Aby uniknąć nieporozumień z funkcjami maskującymi, jasne jest użycie specyfikacji „package :: function”, jak w przykładzie poniżej:

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

8

W innym przypadku ten błąd wystąpił w następującym kodzie.

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

Można to rozwiązać w następujący sposób.

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

Napotkano podobny problem podczas wykonywania kodu zgodnie ze wspomnianym blogiem, a następnie uruchomiono rozwiązanie w 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
  )

Odłączanie po uruchomieniu, po ponownym uruchomieniu powyższego kodu działało dobrze, chociaż otrzymałem komunikat ostrzegawczy, jak pokazano poniżej, nie jestem pewien, czy plyr został rozładowany, czy nie.

Komunikat ostrzegawczy: nie można wyładować przestrzeni nazw „plyr”: przestrzeń nazw „plyr” jest importowana przez „reshape2”, „scales”, „broom”, „ggplot2”, więc nie można jej usunąć


0

dla mnie rozwiązaniem była detach()funkcja, którą wykorzystałem w pakiecie funkcji


Czy możesz wyjaśnić, co masz na myśli, mówiąc „Wykorzystałem ten pakiet funkcji”?
Anonimowy tchórz

1
przepraszam, użyłem funkcji detach () do pobrania pakietu, miałem konflikt między pakietami dplyr i knitr, a następnie użyj funkcji do odłączenia pakietu ("pakiet: knitr", unload = TRUE)
camilo lopez
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.