Recuentos y proporciones dentro de dataframes anidados
Me gustaría contar y calcular proporciones dentro de varios subdataframes. Solía hacer esto con un código feo, usando lapply y creando y recorriendo muchos objetos. Con el paquete purrr esto debería ser más sencillo, sin embargo no lo logré hasta ahora.
Ilustración con el conjunto de datos estándar de R “mtcars”:
El siguiente código es una solución estándar de dplyr (que funciona):
mtcars %>% group_by(vs, am) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
Así, obtengo las proporciones y conteos dentro de los niveles de “vs” (0 y 1). Sin embargo, quiero calcular los conteos y proporciones agrupados dentro de varios subgrupos de “carb”. Entonces, con dplyr estándar, se vería así (también funciona):
mtcars %>% filter(carb == 1) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
mtcars %>% filter(carb == 2) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
etc.
Esto funciona pero es complicado.
Con Purrr debería verse algo así:
mtcars %>% group_by(carb) %>% nest() %>% mutate(n = map(data, count))
Aquí, sin embargo, se pierde el agrupamiento “group_by(vs, am)”. ¿Cómo puedo introducir el agrupamiento aquí?
¡Muchas gracias de antemano!
davy.ai
Para introducir el agrupamiento usando purrr, puedes usar la función
map()
para aplicar las funcionesgroup_by()
ysummarise()
a cada dataframe anidado. Puedes hacerlo de la siguiente manera:Esto agrupa el dataframe
mtcars
porcarb
,vs
yam
, y luego anida los datos para cada combinación de estas variables.La función
map()
se utiliza dos veces en este ejemplo. La primera llamada amap()
aplica las funcionesgroup_by()
ysummarise()
a cada dataframe anidado para producir un dataframe con las cuentas para cada combinación devs
yam
. Los dataframes resultantes se almacenan en una columna llamadacounts
.La segunda llamada a
map()
luego aplica la funciónprop.table()
a cada dataframe decounts
para producir un dataframe con las proporciones para cada combinación devs
yam
. Los dataframes resultantes se almacenan en una columna llamadaproportions
.Ten en cuenta que esto producirá un dataframe anidado con tres columnas:
carb
,data
yproportions
. La columnadata
contiene los dataframes anidados y la columnaproportions
contiene las proporciones calculadas.