如何在R语言中按多列相同值分组生成求和结果列
解决方案
针对你的需求,推荐两种高效且适配大数据量的实现方式,分别基于dplyr和data.table,这两个工具在处理大规模数据集时性能远优于逐行遍历的方法:
方法一:使用dplyr(tidyverse生态)
dplyr的分组+突变操作可以轻松实现需求,代码简洁易读:
# 加载包 library(dplyr) # 构造示例数据 S1 <- c(1,1,1,0,1,0) S2 <- c(1,1,1,0,1,0) S3 <- c(1,0,0,0,0,0) value <- c(9,5,3,2,4,1) df <- data.frame(S1,S2,S3,value) # 分组求和并生成result列 df <- df %>% group_by(S1, S2, S3) %>% mutate(result = sum(value)) %>% ungroup() # 取消分组(可选,后续操作不需要分组时建议执行) # 查看结果 df
执行后会得到你期望的结果:
S1 S2 S3 value result 1 1 1 1 9 9 2 1 1 0 5 12 3 1 1 0 3 12 4 0 0 0 2 3 5 1 1 0 4 12 6 0 0 0 1 3
方法二:使用data.table(高性能大数据处理)
如果你的数据集行数非常多(比如百万级以上),data.table的内存效率和运行速度会更有优势:
# 加载包 library(data.table) # 构造示例数据并转为data.table S1 <- c(1,1,1,0,1,0) S2 <- c(1,1,1,0,1,0) S3 <- c(1,0,0,0,0,0) value <- c(9,5,3,2,4,1) dt <- data.table(S1,S2,S3,value) # 分组求和生成result列 dt[, result := sum(value), by = .(S1, S2, S3)] # 查看结果 dt
为什么你的之前尝试没成功?
rowwise()是按单行独立处理,不是按分组聚合,所以无法实现组内求和后映射到每行的需求;sapply()逐行匹配分组的方式本质是循环遍历,不仅代码复杂,而且在数据量大时会非常慢,完全不适用于大规模数据集。
内容的提问来源于stack exchange,提问作者SPI_4324
相关产品推荐
相关产品推荐

