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.