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

R语言:按行对前缀相似的数据框列求和

按前缀分组对数据框列做行求和的R实现

嘿,针对你这个把同前缀列按行求和的需求,我给你准备了两种实用的R解决方案,不管是习惯用tidyverse工具链还是偏好基础R,都能轻松搞定,而且这套逻辑完全可以迁移到你实际要处理的utm参数网页浏览量合并场景里~

方法一:用tidyverse工具包(可读性拉满,推荐)

如果你平时经常用dplyr这类包,这个方法会很顺手:

# 先加载需要的包
library(dplyr)
library(tidyr)
library(stringr)

# 你的原始数据
data <- data.frame(a.1 = 1:5, a.2b = 3:7, a.5 = 5:9, bt.16 = 4:8, bt.12342 = 7:11)

# 核心处理流程
result <- data %>%
  # 把宽格式转成长格式,方便按前缀分组
  pivot_longer(everything(), names_to = "col_name", values_to = "value") %>%
  # 提取列名的前缀:按第一个点分割,取第一部分
  mutate(prefix = str_split(col_name, "\\.", n = 2) %>% map_chr(1)) %>%
  # 按行号和前缀分组,计算每行的总和
  group_by(row_number(), prefix) %>%
  summarise(total = sum(value), .groups = "drop") %>%
  # 再转回宽格式,得到最终的汇总数据框
  pivot_wider(names_from = prefix, values_from = total)

# 可以去掉行号列,只保留我们需要的a和bt列
result <- result %>% select(-`row_number()`)

print(result)

运行后会得到你想要的结果:

a bt
1  9 11
2 10 12
3 11 13
4 12 14
5 13 15

方法二:基础R实现(不用装额外包,轻量高效)

要是你不想加载第三方包,用基础R的函数也能实现:

# 原始数据
data <- data.frame(a.1 = 1:5, a.2b = 3:7, a.5 = 5:9, bt.16 = 4:8, bt.12342 = 7:11)

# 自动提取所有列的前缀(按第一个点分割)
prefixes <- unique(sub("\\..*", "", colnames(data)))

# 初始化结果数据框
result <- data.frame()

# 遍历每个前缀,计算对应列的行求和
for (prefix in prefixes) {
  # 筛选出当前前缀开头的列(正则确保匹配前缀+点的格式,避免误判)
  target_cols <- grepl(paste0("^", prefix, "\\."), colnames(data))
  # 按行求和,添加到结果框里
  result[[prefix]] <- rowSums(data[, target_cols])
}

print(result)

运行结果和上面完全一致,而且代码轻量,适合处理大规模数据。

适配实际场景的小提示

针对你后面提到的合并带不同utm参数的网页浏览量数据,这个方案可以直接复用:

  • 只要你的utm列是类似utm_source_xxx、utm_medium_yyy这种格式,代码会自动识别utm_source、utm_medium这类前缀;
  • 如果你的分隔符不是点,只要把正则表达式里的\\.改成对应的分隔符(比如下划线_)就行,非常灵活。

内容的提问来源于stack exchange,提问作者TSim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:26