Cuando se utiliza summarise
con plyr
‘s ddply
función de las categorías vacías son descartados por defecto. Puede cambiar este comportamiento por la adición de .drop = FALSE
. Sin embargo, esto no funciona cuando se utiliza summarise
con dplyr
. Hay otra forma de mantener las categorías vacías en el resultado?
He aquí un ejemplo con datos falsos.
library(dplyr)
df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)
# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)
b count_a
1 1 6
2 2 6
3 3 0
# Now try it with dplyr
df %.%
group_by(b) %.%
summarise(count_a=length(a), .drop=FALSE)
b count_a .drop
1 1 6 FALSE
2 2 6 FALSE
No es exactamente lo que yo estaba esperando. Hay un dplyr
método para lograr el mismo resultado que .drop=FALSE
en plyr
?
Desde dplyr 0.8
group_by
ganado la.drop
argumento de que hace exactamente lo que usted solicitó:Una nota adicional a ir con @Moody_Mudskipper la respuesta: el Uso de
.drop=FALSE
puede potencialmente dar lugar a resultados inesperados cuando una o más de las variables de agrupación no están codificados de los factores. Vea los ejemplos a continuación:count
:iris %>% count(Species, group2, .drop=FALSE)
El tema sigue abierto, pero en el ínterin, especialmente desde que sus datos están ya incluido, usted puede utilizar
complete
de «tidyr» para conseguir lo que usted podría estar buscando:Si quería que el valor de reposición a cero, es necesario precisar que con
fill
:ungroup()
antes de completar. Si alguna vez te avisocomplete
en realidad no completar,ungroup
probablemente es necesario.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(es, en realidad, en la ayuda paracomplete
todavía me tomó un tiempo para averiguardplyr solución:
Primero hacer agrupados df
a continuación hacemos un resumen de los niveles que se producen por contar con
n()
entonces podemos combinar nuestros resultados dentro de un marco de datos que contiene todos los niveles de los factores:
por último, en este caso, dado que estamos mirando en cuenta el
NA
se cambian los valores a 0.Esto también puede ser implementado funcionalmente, vea las respuestas:
Agregar filas para datos agrupados con dplyr?
Un hack:
Pensé que iba a publicar un terrible hack que funciona en este caso, por causa de interés. Tengo serias dudas de que alguna vez debería hacer esto pero muestra cómo
group_by()
genera el atributo como sidf$b
era un personaje de vectores no es un factor con los niveles. Además, yo no pretendo entender esto correctamente, pero yo estoy esperando que esto me ayuda a aprender-esta es la única razón por la que estoy publicando!definir un «fuera de límites» valor que no puede existir en el conjunto de datos.
modificar los atributos de «engañar» a
summarise()
:hacer el resumen:
índice y reemplazar todas las ocurrencias de oob_val
que da a la intención de:
esto no es exactamente lo que se les pide en la pregunta, pero al menos para este sencillo ejemplo, usted podría conseguir el mismo resultado con xtabs, por ejemplo:
utilizando dplyr:
o más corto:
resultado (igual en ambos casos):