Search code examples
rdplyrtally

R Dplyr Add Rows Total


    HAVE = data.frame(STUDENT = c(1,2,3,4),
YEAR = c(2020,2020,2021,2020),
                      SCORE1 = c(5,9,8,0),
                      TEST = c(7,11,3,9))
    
    WANT = data.frame(STUDENT = c(1,2,3,4, 'ALL'),
YEAR = c(2020, 2020, 2021, 2020,NA),
                      SCORE1 = c(5,9,8,0,22),
                       TEST = c(7,11,3,9,30))

I have 'HAVE' and wish to create 'WANT' which does this: Add row to HAVE where STUDENT = 'ALL' and SCORE1 = sum up all values of SCORE and TEST = sum up all values of TEST.

I try this with no success:

WANT = rowbind(HAVE, data.frame(STUDENT = 'ALL', SCORE1 = sum(HAVE$SCORE1), TEST = sum(HAVE$TEST))

But is there a efficient DPLYR solution?


Solution

  • With dplyr:

    library(dplyr)
    
    HAVE %>% 
      mutate(STUDENT = as.character(STUDENT)) %>% 
      bind_rows(summarise(.,
                          across(where(is.numeric), sum),
                          across(where(is.character), ~"All")))
    
      STUDENT SCORE1 TEST
    1       1      5    7
    2       2      9   11
    3       3      8    3
    4       4      0    9
    5     All     22   30
    

    OR Maybe with janitor package:

    libray(dplyr)
    library(janitor)
    HAVE %>% 
      adorn_totals("row") 
    
     STUDENT SCORE1 TEST
           1      5    7
           2      9   11
           3      8    3
           4      0    9
       Total     22   30