una - Agregue los totales de las filas de margen en la cadena dplyr
como hacer una cadena de valor (3)
Con adorn_totals () del paquete janitor:
library(janitor)
mtcars %>%
tabyl(cyl, gear) %>%
adorn_totals("row")
cyl 3 4 5
4 1 8 2
6 2 4 1
8 12 0 2
Total 15 12 5
Para ir de allí al formulario "largo" de tu publicación, agrega tidyr::gather()
a la tubería:
mtcars %>%
tabyl(cyl, gear) %>%
adorn_totals("row") %>%
tidyr::gather(gear, n, 2:ncol(.), convert = TRUE)
cyl gear n
1 4 3 1
2 6 3 2
3 8 3 12
4 Total 3 15
5 4 4 8
6 6 4 4
7 8 4 0
8 Total 4 12
9 4 5 2
10 6 5 1
11 8 5 2
12 Total 5 5
Alerta de autopromoción, escribí este paquete, agregando esta respuesta porque es una solución realmente eficaz aquí.
Me gustaría agregar filas de resumen general al mismo tiempo que calculo los resúmenes por grupo usando dplyr. He encontrado varias preguntas sobre cómo hacer esto, por ejemplo, here , here y here , pero no hay una solución clara. Un enfoque posible es realizar el count
dos veces y enlazar las filas:
mtcars %>%
count(cyl, gear) %>%
bind_rows(
count(mtcars, gear)
)
que casi produce lo que necesito (la columna más a la izquierda tiene NA en lugar de ''Total'' o similar):
cyl gear n
<dbl> <dbl> <int>
1 4 3 1
2 4 4 8
3 4 5 2
4 6 3 2
5 6 4 4
6 6 5 1
7 8 3 12
8 8 5 2
9 NA 3 15
10 NA 4 12
11 NA 5 5
¿Me falta una solución más fácil / integrada?
Una adición a la respuesta de @arkrun que no es fácil de agregar como comentario:
Aunque un poco más complejo, este formato permite modificaciones previas en el marco de datos. Útil cuando hay una cadena más larga de verbos antes de que se genere la tabla. (Desea cambiar nombres, o seleccionar solo variables específicas)
mtcars %>%
count(cyl, gear) %>%
ungroup() %>%
mutate(cyl=as.character(cyl))
bind_rows(group_by(.,gear) %>%
summarise(n=sum(n)) %>%
mutate(cyl=''Total'')) %>%
spread(cyl)
## A tibble: 3 x 5
# gear `4` `6` `8` Total
#* <dbl> <dbl> <dbl> <dbl> <dbl>
#1 3 1 2 12 15
#2 4 8 4 0 12
#3 5 2 1 2 5
Esto también se puede duplicar para generar una fila total para la propagación también.
mtcars %>%
count(cyl, gear) %>%
ungroup() %>%
mutate(cyl=as.character(cyl),
gear = as.character(gear)) %>%
bind_rows(group_by(.,gear) %>%
summarise(n=sum(n)) %>%
mutate(cyl=''Total'')) %>%
bind_rows(group_by(.,cyl) %>%
summarise(n=sum(n)) %>%
mutate(gear=''Total'')) %>%
spread(cyl,n,fill=0)
# A tibble: 4 x 5
gear `4` `6` `8` Total
* <chr> <dbl> <dbl> <dbl> <dbl>
1 3 1 2 12 15
2 4 8 4 0 12
3 5 2 1 2 5
4 Total 11 7 14 32
Una opción es do
mtcars %>%
count(cyl, gear) %>%
ungroup() %>%
mutate(cyl=as.character(cyl)) %>%
do(bind_rows(., data.frame(cyl="Total", count(mtcars, gear))))
#or replace the last ''do'' step with
#bind_rows(cbind(cyl=''Total'', count(mtcars, gear))) #from @JonnyPolonsky''s comments
# cyl gear n
# <chr> <dbl> <int>
#1 4 3 1
#2 4 4 8
#3 4 5 2
#4 6 3 2
#5 6 4 4
#6 6 5 1
#7 8 3 12
#8 8 5 2
#9 Total 3 15
#10 Total 4 12
#11 Total 5 5