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

Michael Bellhouse
la source

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.

mnel
la source
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()) 
user2487691
la source
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))
user1257894
la source
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
Keiku
la source
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é

CuriousCoder
la source
0

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

camilo lopez
la source
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