dplyr: "Error en n (): la función no debe llamarse directamente"


96

Estoy intentando reproducir uno de los ejemplos en el paquete dplyr pero recibo este mensaje de error. Espero ver una nueva columna n producida con la frecuencia de cada combinación. ¿Qué me estoy perdiendo? Verifiqué tres veces que el paquete está cargado.

 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 en n (): esta función no debe llamarse directamente

Respuestas:


120

Supongo que lo tienes dplyry lo has plyrcargado en la misma sesión. dplyrno lo es plyr. ddplyno es una función en el dplyrpaquete.

Ambos dplyry plyrtienen las funciones summarise/ summarize.

Mira los resultados de conflicts()para ver objetos enmascarados.


31
La solución es asegurarse de cargar plyrprimero
hadley

16
Como dice @ User1257894, use summarizecon el paquete, algo como esto dplyr::summarize(count = n()).
Rafa Barragán

39

Como se mencionó en la respuesta anterior, es posible que tenga un conflicto entre plyr y dplyr. Puede ejecutar este comando para descargar el paquete plyr.

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

Entonces puede continuar como se esperaba.

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

Exactamente ... el conflicto estaba entre resumir o resumir. También cargué accidentalmente plyry dplyrpaquetes en uno de mis proyectos y me di cuenta de este conflicto. buen compañero de trabajo.
Manoj Kumar

26

Para evitar confusiones con las funciones de enmascaramiento, está claro utilizar la especificación "paquete :: función", como el ejemplo siguiente:

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

8

En otro caso, este error ocurrió en el siguiente código.

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

Se puede resolver de la siguiente manera.

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

Enfrenté un problema similar al ejecutar el código según el blog mencionado y luego ejecutar la solución en detach ("paquete: 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
  )

Después de ejecutar detach, cuando se volvió a ejecutar el código anterior, funcionó bien, aunque recibió un mensaje de advertencia como se muestra a continuación, no estoy seguro de si plyr se descargó o no. ¿Y cómo se ejecuta el código correctamente?

Mensaje de advertencia: el espacio de nombres 'plyr' no se puede descargar: el espacio de nombres 'plyr' es importado por 'reshape2', 'scale', 'broom', 'ggplot2', por lo que no se puede descargar


0

para mí, la solución fue la detach()función, utilicé ese paquete de funciones


¿Puede aclarar lo que quiere decir con "utilicé ese paquete de funciones"?
Cobarde anónimo

1
perdón, usé la función detach () para bajar un paquete, tuve el conflicto entre los paquetes dplyr y knitr, luego uso la función para bajar el paquete detach ("paquete: knitr", unload = TRUE)
camilo lopez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.