r adding % to output from ftable

Viewed 30

This is a three way crosstable of frequencies in my dataset

                  Group 1         Group 2
A       I         78              74
        II        51              45
        III       13              17
        NA        29              22
B       I         182             13
        II        110             16 
        III       74              6
        NA        0               0
C       I         386             47
        II        284             28
        III       240             42   
        NA        0               0
D       I         6               0
        II        5               2
        III       6               5 
        NA        0               0 
E       I         164             17
        II        181             31
        III       0               0
        NA        0               0

How do I take this table and add column percent like this.

Expected output

                  Group 1         Group 2
A       I         78(45.614%)     74(46.835%)
        II        51(29.824%)     45(28.481%)
        III       13(7.602%)      17(10.759%)
        NA        29(16.959%)     22(13.924%)

B       I         182(49.726%)    13(37.143%)
        II        110(30.054%)    16(45.714%) 
        III       74 (20.2186%)   6 (17.143%)
        NA        0  (0%)         0  (0%)  

C       I         386 (42.185%)   47 (41.964%)
        II        284 (...%)      28 (...%)
        III       240 (...%)      42 (...%)   
        NA        0   (0%)        0  (0%)

D       I         6   (28.517%)    0  (0%)
        II        5   (...%)      2  (...%)
        III       6   (...%)      5  (...%)
        NA        0   (0%)        0  (0%)

E       I         164 (47.564%)   17 (34.090%)
        II        181 (...%)      31 (...%)
        III       0   (...%)      0  (...%)
        NA        0   (0%)        0  (0%)

The column % are estimated for subgroups A,B,C,D,E separately.

For subset A

Group 1 column Sum = 171
Group 2 column Sum = 158

              Group 1                       Group 2
A       I     78(78*100/171 = 45.614%)      74(74*100/158= 46.835%)
        II    51(51*100/171 =29.824%)       45(45*100/158=28.481%)
        III   13(13*100/171 =7.602%)        17(17*100/158=10.759%)
        NA    29(29*100/171 =16.959%)       22(22*100/158=13.924%)

Similarly for subgroup B,C,D,&E

1 Answers
library(tidyverse)
library(janitor)

df %>%
  mutate(tmp = var_1) %>% 
  fill(tmp) %>%
  group_split(tmp) %>%
  map(
    ~ adorn_percentages(dat = .x, "col") %>%
      adorn_pct_formatting(digits = 3) %>%
      adorn_ns(position = "front")
  ) %>% 
  bind_rows() %>% 
  select(-tmp)

#>  var_1 var_2       Group_1      Group_2
#>      A     I  78 (45.614%) 74 (46.835%)
#>   <NA>    II  51 (29.825%) 45 (28.481%)
#>   <NA>   III  13  (7.602%) 17 (10.759%)
#>   <NA>  <NA>  29 (16.959%) 22 (13.924%)
#>      B     I 182 (49.727%) 13 (37.143%)
#>   <NA>    II 110 (30.055%) 16 (45.714%)
#>   <NA>   III  74 (20.219%)  6 (17.143%)
#>   <NA>  <NA>   0  (0.000%)  0  (0.000%)
#>      C     I 386 (42.418%) 47 (40.171%)
#>   <NA>    II 284 (31.209%) 28 (23.932%)
#>   <NA>   III 240 (26.374%) 42 (35.897%)
#>   <NA>  <NA>   0  (0.000%)  0  (0.000%)
#>      D     I   6 (35.294%)  0  (0.000%)
#>   <NA>    II   5 (29.412%)  2 (28.571%)
#>   <NA>   III   6 (35.294%)  5 (71.429%)
#>   <NA>  <NA>   0  (0.000%)  0  (0.000%)
#>      E     I 164 (47.536%) 17 (35.417%)
#>   <NA>    II 181 (52.464%) 31 (64.583%)
#>   <NA>   III   0  (0.000%)  0  (0.000%)
#>   <NA>  <NA>   0  (0.000%)  0  (0.000%)

data

df <- data.frame(
  stringsAsFactors = FALSE,
  var_1 = c("A",NA,NA,NA,"B",NA,NA,
            NA,"C",NA,NA,NA,"D",NA,NA,NA,"E",NA,NA,NA),
  var_2 = c("I","II","III",NA,"I","II",
            "III",NA,"I","II","III",NA,"I","II","III",NA,
            "I","II","III",NA),
  Group_1 = c(78L,51L,13L,29L,182L,110L,
              74L,0L,386L,284L,240L,0L,6L,5L,6L,0L,164L,
              181L,0L,0L),
  Group_2 = c(74L,45L,17L,22L,13L,16L,
              6L,0L,47L,28L,42L,0L,0L,2L,5L,0L,17L,31L,0L,
              0L)
)
Related