Cuando se utiliza la función de summarisewith , las categorías vacías se eliminan de forma predeterminada. Puede cambiar este comportamiento agregando . Sin embargo, esto no funciona cuando se usa con . ¿Existe otra forma de mantener categorías vacías en el resultado?plyrddply.drop = FALSEsummarisedplyr
Aquí tienes 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 esperaba. ¿Existe algún dplyrmétodo para lograr el mismo resultado que .drop=FALSEen plyr?

Respuestas:
Dado que dplyr 0.8
group_byobtuvo el.dropargumento que hace exactamente lo que solicitó:Una nota adicional para acompañar la respuesta de @ Moody_Mudskipper: el uso
.drop=FALSEpuede dar resultados potencialmente inesperados cuando una o más variables de agrupación no están codificadas como factores. Vea ejemplos a continuación:fuente
count:iris %>% count(Species, group2, .drop=FALSE)El problema aún está abierto, pero mientras tanto, especialmente porque sus datos ya están factorizados, puede usar
completefrom "tidyr" para obtener lo que podría estar buscando:Si desea que el valor de reemplazo sea cero, debe especificarlo con
fill:fuente
ungroup()antes de completar. Si alguna vez nota quecompleteno está completando,ungroupprobablemente sea necesario.complete(variablewithdroppedlevels, nesting(var1,var2,var3))(en realidad está en la ayuda porquecompletetodavía me tomó un tiempo descubrirlosolución dplyr:
Primero haz df agrupado
luego resumimos esos niveles que ocurren contando con
n()luego fusionamos nuestros resultados en un marco de datos que contiene todos los niveles de factores:
finalmente, en este caso, dado que estamos viendo recuentos, los
NAvalores se cambian a 0.Esto también se puede implementar funcionalmente, vea las respuestas: ¿ Agregar filas a datos agrupados con dplyr?
Un truco:
Pensé que publicaría un truco terrible que funciona en este caso por el interés. Dudo seriamente que realmente
group_by()debas hacer esto, pero muestra cómo genera los atributos como sidf$bfuera un vector de caracteres, no un factor con niveles. Además, no pretendo entender esto correctamente, pero espero que esto me ayude a aprender, ¡esta es la única razón por la que lo estoy publicando!definir un valor "fuera de límites" que no puede existir en el conjunto de datos.
modificar atributos a "truco"
summarise():haz el resumen:
indexar y reemplazar todas las apariciones de oob_val
que da lo previsto:
fuente
esto no es exactamente lo que se preguntó en la pregunta, pero al menos para este ejemplo simple, podría obtener el mismo resultado usando xtabs, por ejemplo:
usando dplyr:
o más corto:
resultado (igual en ambos casos):
fuente