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
相关产品推荐
相关产品推荐

