You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:08:10