dplyr: “Erro em n (): a função não deve ser chamada diretamente”


96

Estou tentando reproduzir um dos exemplos do pacote dplyr, mas estou recebendo esta mensagem de erro. Estou esperando ver uma nova coluna n produzida com a frequência de cada combinação. o que estou perdendo? Eu verifiquei três vezes se o pacote está carregado.

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

Erro em n (): esta função não deve ser chamada diretamente

Respostas:


120

Presumo que você tenha dplyre plyrcarregado na mesma sessão. dplyrnão é plyr. ddplynão é uma função do dplyrpacote.

Ambos dplyre plyrtêm as funções summarise/ summarize.

Observe os resultados de conflicts()para ver os objetos mascarados.


31
A solução é certificar-se de carregar plyrprimeiro
hadley de

16
Como @ User1257894 diz, use summarizecom o pacote, algo assim dplyr::summarize(count = n()).
Rafa Barragan

39

Conforme mencionado na resposta anterior, você pode ter um conflito entre plyr e dplyr. Você pode executar este comando para descarregar o pacote plyr.

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

Então você pode continuar conforme o esperado.

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

Exatamente ... o conflito era entre resumir ou resumir. Eu também carreguei acidentalmente plyre dplyrpacotes em um de meus projetos e percebi esse conflito. bom trabalho, companheiro.
Manoj Kumar

26

Para evitar confusões com funções de mascaramento, é claro usar a especificação "package :: function", como o exemplo abaixo:

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

8

Em outro caso, esse erro ocorreu no código a seguir.

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

Isso pode ser resolvido da seguinte maneira.

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

Enfrentou um problema semelhante ao executar o código conforme o blog mencionado e, em seguida, execute a solução em 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
  )

Pós-execução de desanexação, quando o código acima foi executado novamente, ele funcionou bem, embora tenha recebido uma mensagem de aviso conforme abaixo, não tenho certeza se plyr foi descarregado ou não. E como o código é executado corretamente?

Mensagem de aviso: o namespace 'plyr' não pode ser descarregado: o namespace 'plyr' é importado por 'reshape2', 'escala', 'vassoura', 'ggplot2', portanto não pode ser descarregado


0

para mim, a solução foi a detach()função, usei esse pacote de função


Você pode esclarecer o que quer dizer com "Eu utilizei esse pacote de funções inativas"?
Covarde anônimo

1
desculpe, eu usei a função detach () para baixar um pacote, tive o conflito entre os pacotes dplyr e knitr e use a função para desanexar pacote ("pacote: knitr", descarregar = TRUE)
camilo lopez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.