R语言如何按列名相同前缀分组并对同组列逐行求和
R实现按列名前缀分组逐行求和的方法
错误原因
你编写的dplyr代码报错的核心原因是group_by()是用来对数据集的行进行分组的,而你要实现的是对列按前缀分组逐行求和,逻辑完全不匹配。
实现方法
方法1:基础R实现(逻辑最接近pandas的写法)
这个方法和你用的pandas按列分组的思路完全一致:
# 提取所有列名的第一个字符作为分组前缀 prefix <- substr(colnames(df), 1, 1) # 按前缀拆分列,逐行求和 result <- as.data.frame(sapply(split.default(df, prefix), rowSums))
运行后得到的result就是你需要的输出。
方法2:tidyverse(dplyr+tidyr)通用实现
如果前缀数量不固定,你可以用长表转换的思路实现通用逻辑:
library(tidyverse) result <- df %>% # 宽表转长表,拆分列名提取前缀 pivot_longer( cols = everything(), names_to = c("prefix", NA), names_pattern = "^(.)(.*)$" ) %>% # 按行号和前缀分组求和 group_by(row_id = row_number(), prefix) %>% summarise(value = sum(value), .groups = "drop") %>% # 转回宽表 pivot_wider(names_from = prefix, values_from = value) %>% # 移除辅助的行号列 select(-row_id)
方法3:固定前缀的简洁写法
如果你的列前缀是已知的且数量不多,可以直接用这种更直观的写法:
library(dplyr) result <- df %>% rowwise() %>% transmute( a = sum(c_across(starts_with("a"))), b = sum(c_across(starts_with("b"))), c = sum(c_across(starts_with("c"))) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

