Supongamos que quiero calcular la proporción de diferentes valores dentro de cada grupo. Por ejemplo, usando los mtcars
datos, ¿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
summarise
la última variable de agrupación especificada engroup_by
'engranaje'. En elmutate
paso, 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_by
llamada. 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 elam
grupo y no en elgear
grupo también ...summarise
eso, 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
am
dplyr <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
dplyr
0.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
format
método que agregue un signo de porcentaje ... #overkillAquí hay una función general que implementa la solución de Henrik en
dplyr
0.7.1.fuente
Error in bind_rows_(x, .id) : Column
am` 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.table
en combinación condplyr
odata.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