R Dplyr 添加行总计

4
    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))

我有 'HAVE' 并希望创建 'WANT',它可以执行以下操作: 在HAVE中添加一行,其中STUDENT ='ALL',SCORE1 = SCORE的所有值之和,TEST = TEST的所有值之和。
我尝试过这个但没有成功:
WANT = rowbind(HAVE, data.frame(STUDENT = 'ALL', SCORE1 = sum(HAVE$SCORE1), TEST = sum(HAVE$TEST))

但是是否有一个高效的DPLYR解决方案呢?

3个回答

4

使用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

或者 也可以使用janitor包:

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

这太完美了!假设还有其他列,您希望对它们的“合计”为空,您可以指定将其留空吗?例如,如果有一个名为YEAR的列,我们不想对YEAR求和...我们只希望它成为NA。 - bvowe
1
我更新问题,例如。 - bvowe
1
在我的第一个解决方案中,dplyr 只需添加此行 across(c(YEAR), ~ NA_real_))) %>% ...。在这里,您可以使用 c() 指定要保留 NA 的所有列。希望这很清楚! - TarJae

4

或者使用 base R 中的 addmargins

addmargins(as.matrix(HAVE[-(1:2)]), 1)

3

希望这个能行!使用rbind或bind_rows。

HAVE = data.frame(STUDENT = c(1,2,3,4),
                  SCORE1 = c(5,9,8,0),
                  TEST = c(7,11,3,9)) %>% 
  mutate(STUDENT = as.character(STUDENT))

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


or

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接