R语言:如何基于多Type列对Count列实现优雅的条件求和?
问题:按Type分组汇总对应Count值
原始数据
现有如下R语言data.frame:
ID <- c(1, 2, 3, 4, 5) Type1 <- c("A", "", "A", "B", "C") Count1 <- c(40, NA, 10, 5, 100) Type2 <- c("D", "", "", "C", "D") Count2 <- c(5, NA, NA, 30, 5) Type3 <- c("E", "", "", "D", "") Count3 <- c(10, NA, NA, 5, NA) df <- data.frame(ID, Type1, Count1, Type2, Count2, Type3, Count3)
需求说明
需要对所有Count列的值进行求和,条件是对应的Type列值相同——即Type1、Type2或Type3中值匹配的项,将其对应的Count1、Count2、Count3的值相加,同时统计每个Type出现的次数。
期望输出
最终希望得到如下格式的结果:
Type <- c("A", "B", "C", "D", "E") n <- c(2, 1, 2, 3, 1) Total <- c(50, 5, 130, 15, 10) result <- data.frame(Type, n, Total)
当前实现方法
我已经通过以下代码实现需求,但步骤较为繁琐,希望找到更优雅的方式:
df1 <- data.frame(Type1, Count1) df2 <- data.frame(Type2, Count2) df3 <- data.frame(Type3, Count3) colnames(df1) <- c("Type", "Count") colnames(df2) <- c("Type", "Count") colnames(df3) <- c("Type", "Count") df_all <- rbind(df1, df2, df3) result <- df_all %>% group_by(Type) %>% summarize(num = n(), total = sum(Count))
更优雅的实现方式
可以使用tidyr包的pivot_longer函数一步完成数据重塑,再进行分组汇总,代码更简洁且扩展性更强:
library(tidyverse) # 将宽格式数据转为长格式,自动匹配Type和Count对应关系 df_long <- df %>% pivot_longer( cols = -ID, names_to = c(".value", "group"), names_pattern = "(Type|Count)(\\d)" ) %>% # 过滤无效的空Type和NA的Count值 filter(Type != "", !is.na(Count)) # 分组统计次数和求和 result <- df_long %>% group_by(Type) %>% summarize( n = n(), Total = sum(Count) ) %>% ungroup() print(result)
优势说明
- 无需手动拆分、重命名再合并数据框,一步完成格式转换
- 正则匹配列名,即使后续新增Type4/Count4这类列,代码无需修改即可兼容
- 逻辑清晰,可读性更强
内容的提问来源于stack exchange,提问作者madlu
相关产品推荐
相关产品推荐

