如何在管道运算符中使用apply函数按Group分组对数值列求和
R按分组对数值列求和解决方案
原始数据
> df VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 Group ACSK 16 4 0 25 0 0 7 16 Group3 CKPD 9 19 0 17 0 11 6 13 Group3 AEXF 10 0 0 36 0 0 0 0 Group1 AGNS 34 0 77 30 0 0 0 0 Group3 AGRL 19 0 0 52 0 0 0 0 Group2 AJEH 5 0 40 8 0 0 0 13 Group3 AOKS 34 0 47 43 0 0 0 0 Group2 AYKR 14 0 186 18 0 0 0 0 Group2 MIEY 20 226 0 102 0 0 201 0 Group1 BLHR 13 0 0 50 0 0 0 0 Group1
需求说明
需要按Group变量分组,对每组内的所有数值列分别求和,预期输出如下:
VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 Group 1 43 226 0 188 0 0 201 0 Group1 2 67 0 233 113 0 0 0 0 Group2 3 64 23 117 80 0 11 13 42 Group3
错误代码原因
你给出的代码逻辑和需求不匹配:group_by分组后调用apply(.,1,sum)是对原始数据的每一行做全列求和,没有实现分组后对各列分别求和的效果。
df %>% group_by(Group) %>% apply(., 1, sum) %>% rbind(.)
正确实现方法
方法1:dplyr包实现(推荐)
适配dplyr 1.0.0及以上版本,代码简洁易读:
library(dplyr) result <- df %>% group_by(Group) %>% summarise(across(where(is.numeric), sum))
方法2:基础R实现
无需加载第三方包,直接用内置aggregate函数实现:
result <- aggregate(. ~ Group, data = df, FUN = sum)
复现用数据结构
structure(list(VAR1 = c(16L, 9L, 10L, 34L, 19L, 5L, 34L, 14L, 20L, 13L), VAR2 = c(4L, 19L, 0L, 0L, 0L, 0L, 0L, 0L, 226L, 0L ), VAR3 = c(0, 0, 0, 77, 0, 40, 47, 186, 0, 0), VAR4 = c(25L, 17L, 36L, 30L, 52L, 8L, 43L, 18L, 102L, 50L), VAR5 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), VAR6 = c(0, 11, 0, 0, 0, 0, 0, 0, 0, 0), VAR7 = c(7L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 201L, 0L), VAR8 = c(16L, 13L, 0L, 0L, 0L, 13L, 0L, 0L, 0L, 0L), Group = c("Group3", "Group3", "Group1", "Group3", "Group2", "Group3", "Group2", "Group2", "Group1", "Group1")), row.names = c("ACSK", "CKPD", "AEXF", "AGNS", "AGRL", "AJEH", "AOKS", "AYKR", "MIEY", "BLHR"), class = "data.frame")
内容的提问来源于stack exchange,提问作者Lin Caijin
相关产品推荐
相关产品推荐

