dplyr: "Erreur dans n (): la fonction ne doit pas être appelée directement"


96

J'essaie de reproduire l'un des exemples du package dplyr mais j'obtiens ce message d'erreur. Je m'attends à voir une nouvelle colonne n produite avec la fréquence de chaque combinaison. Qu'est-ce que je rate? J'ai vérifié trois fois que le paquet est chargé.

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

Erreur dans n (): cette fonction ne doit pas être appelée directement

Réponses:


120

Je suppose que vous avez dplyret plyrchargé dans la même session. dplyrn'est pas plyr. ddplyn'est pas une fonction du dplyrpackage.

Les deux dplyret plyront les fonctions summarise/ summarize.

Regardez les résultats de conflicts()pour voir les objets masqués.


31
La solution est de vous assurer de charger en plyrpremier
— hadley

16
Comme le dit @ User1257894, utilisez summarizeavec le paquet, quelque chose comme ça dplyr::summarize(count = n()).
— Rafa Barragan

39

Comme mentionné dans la réponse précédente, vous pouvez avoir un conflit entre plyr et dplyr. Vous pouvez exécuter cette commande pour décharger le package plyr.

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

Ensuite, vous pouvez continuer comme prévu.

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

Exactement ... le conflit était entre résumer ou résumer. J'ai également accidentellement chargé plyret des dplyrpackages dans l'un de mes projets et réalisé ce conflit. bon compagnon de travail.
— Manoj Kumar

26

Pour éviter les confusions avec les fonctions de masquage, il est clair d'utiliser la spécification "package :: function", comme dans l'exemple ci-dessous:

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

8

Dans un autre cas, cette erreur s'est produite dans le code suivant.

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

Il peut être résolu comme suit.

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

Face à un problème similaire lors de l'exécution du code selon le blog mentionné, puis exécutez la solution dans 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
  )

Après avoir exécuté le détachement, lorsque le code ci-dessus a été réexécuté, il a bien fonctionné bien que le message d'avertissement reçu comme ci-dessous, vous ne savez pas si plyr a été déchargé ou non. Et comment le code est-il exécuté correctement?

Message d'avertissement: l'espace de noms 'plyr' ne peut pas être déchargé: l'espace de noms 'plyr' est importé par 'reshape2', 'scale', 'broom', 'ggplot2' et ne peut donc pas être déchargé


0

pour moi, la solution était la detach()fonction J'ai utilisé cette fonction vers le bas


Pouvez-vous clarifier ce que vous entendez par "J'ai utilisé cette fonction vers le bas"?
— Lâche anonyme le

1
désolé j'ai utilisé la fonction detach () pour down un package, j'ai eu le conflit entre les packages dplyr et knitr puis utilisez la fonction pour down package detach ("package: knitr", unload = TRUE)
— camilo lopez
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.