Supongamos que quiero calcular la proporción de diferentes valores dentro de cada grupo. Por ejemplo, usando los mtcarsdatos, ¿cómo calculo la frecuencia relativa del número de engranajes por am (automático / manual) de una vez dplyr?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
Lo que me gustaría lograr:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154

prop.table()/sweep(). Además, en otras preguntas, algunas personas piden la opción de incluir recuentos cero para variables o interacciones variablesRespuestas:
Prueba esto:
De la viñeta dplyr :
Por lo tanto, después de , se despega
summarisela última variable de agrupación especificada engroup_by'engranaje'. En elmutatepaso, los datos se agrupan por las variables de agrupación restantes, aquí 'am'. Puede verificar la agrupación en cada paso congroups.El resultado del pelado depende, por supuesto, del orden de las variables de agrupación en la
group_byllamada. Es posible que desee hacer un posteriorgroup_by(am), para que su código sea más explícito.Para redondear y prettificar, consulte la buena respuesta de @Tyler Rinker.
fuente
sum(n)funciona en elamgrupo y no en elgeargrupo también ...summariseeso, dice qué grupos quedan. Oh dplyr rocks ...Puede usar la
count()función, que tiene un comportamiento diferente según la versión dedplyr:dplyr 0.7.1: devuelve una tabla desagrupada : debe agrupar nuevamente por
amdplyr <0.7.1: devuelve una tabla agrupada , por lo que no es necesario agrupar nuevamente, aunque es posible que desee realizar
ungroup()manipulaciones posterioresdplyr 0.7.1
dplyr <0.7.1
Esto da como resultado una tabla agrupada , si desea usarla para un análisis posterior, puede ser útil eliminar el atributo agrupado con
ungroup().fuente
dplyr0.7.1. Realiza el cálculo de frecuencia en general en "marcha", en lugar de dentro de cada nivel de "am".@ Henrik's es mejor para la usabilidad, ya que esto hará que el carácter de la columna ya no sea numérico, sino que coincida con lo que solicitó ...
EDITAR Porque Spacedman lo pidió :-)
fuente
formatmétodo que agregue un signo de porcentaje ... #overkillAquí hay una función general que implementa la solución de Henrik en
dplyr0.7.1.fuente
Error in bind_rows_(x, .id) : Columnam` no se puede convertir de numérico a carácter`Escribí una pequeña función para esta tarea repetitiva:
Entonces puedo usarlo como:
Vuelve:
fuente
A pesar de las muchas respuestas, un enfoque más que se utiliza
prop.tableen combinación condplyrodata.table.fuente
Esta respuesta se basa en la respuesta de Matifou.
Primero lo modifiqué para asegurarme de que no se devuelve la columna de frecuencia como una columna de notación científica mediante la opción scipen.
Luego multiplico la respuesta por 100 para obtener un porcentaje en lugar de un decimal para que la columna de frecuencia sea más fácil de leer como porcentaje.
fuente