Cuando se utiliza la función de summarise
with , 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?plyr
ddply
.drop = FALSE
summarise
dplyr
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 dplyr
método para lograr el mismo resultado que .drop=FALSE
en plyr
?
Respuestas:
Dado que dplyr 0.8
group_by
obtuvo el.drop
argumento que hace exactamente lo que solicitó:Una nota adicional para acompañar la respuesta de @ Moody_Mudskipper: el uso
.drop=FALSE
puede 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
complete
from "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 quecomplete
no está completando,ungroup
probablemente sea necesario.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(en realidad está en la ayuda porquecomplete
todaví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
NA
valores 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$b
fuera 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