2014-04-02 18 views
75

Próbuję odtworzyć jeden z przykładów w pakiecie dplyr, ale ten komunikat o błędzie. Spodziewam się zobaczyć nową kolumnę n wyprodukowaną z częstotliwością każdej kombinacji. Czy ktoś może mi powiedzieć, czego mi brakuje? Potrójnie sprawdziłem, czy paczka jest załadowana. Dzięki za pomoc, jak zawsze.dplyr: "Błąd w n(): funkcja nie powinna być wywoływana bezpośrednio"

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 

Odpowiedz

97

Przypuszczam masz dplyr i plyr załadowany w tej samej sesji. dplyr nie jest plyr. ddply nie jest funkcją w pakiecie dplyr.

Zarówno dplyr, jak i plyr mają funkcje summarise/summarize.

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

+26

Rozwiązaniem jest, aby upewnić się załadować 'plyr' pierwszy – hadley

+8

Jako @ User1257894 mówi, użyj' summarize' z pakietem, coś takiego 'dplyr :: podsumować (count = n())'. –

26

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żna kontynuować zgodnie z oczekiwaniami.

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

Dokładnie ... konflikt był między podsumowaniem lub podsumowaniem. Przypadkowo załadowałem pakiety 'plyr' i' dplyr' w jednym z moich projektów i zdałem sobie sprawę z tego konfliktu. miły kolega z pracy. –

21

Aby uniknąć nieporozumień z funkcjami maskujących, oczywiste jest, aby korzystać ze specyfikacją „pakiet :: funkcja”, jak przykład poniżej:

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

Ładne obejście! –

4

W innym przypadku, wystąpił ten błąd 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 
Powiązane problemy