如何在R中按行求和另一列指定的子集列?
解决R语言中按行指定列名求和的问题
针对你遇到的需求——根据每行columns_to_sum列指定的列名计算对应数值之和,这里提供几种实用的解决方法:
方法1:使用dplyr的rowwise+across组合
这是tidyverse生态下最直观的写法,按行处理每行的列名解析与求和:
library(dplyr) df <- df %>% rowwise() %>% mutate(result_column = sum(across(all_of(strsplit(columns_to_sum, ", ")[[1]])))) %>% ungroup()
rowwise():让后续的mutate操作按行独立执行strsplit(columns_to_sum, ", ")[[1]]:将每行的列名字符串拆分为列名向量all_of():用于引用动态生成的列名,避免列名匹配警告across():选中指定列后求和
方法2:使用purrr逐行映射处理
如果需要更灵活的行级操作,可以结合purrr的map函数:
library(dplyr) library(purrr) df <- df %>% mutate(result_column = map_dbl(columns_to_sum, ~{ # 拆分当前行的列名字符串 target_cols <- strsplit(.x, ", ")[[1]] # 提取当前行对应列的数值并求和 sum(select(df, all_of(target_cols))[cur_row(), ]) }))
map_dbl():遍历columns_to_sum的每个元素,返回数值型结果向量cur_row():在mutate中标记当前处理的行位置
方法3:基础R原生实现
如果不想加载额外包,用基础R的apply函数就能完成:
df$result_column <- apply(df, 1, function(row_data) { # 拆分列名字符串 target_cols <- strsplit(row_data["columns_to_sum"], ", ")[[1]] # 提取对应列的数值并求和(注意转换为数值型) sum(as.numeric(row_data[target_cols])) })
apply(df, 1, ...):按行遍历数据框的每一行as.numeric():确保提取的列值转换为数值类型(避免因子类型导致错误)
注意事项
如果你的实际数据中columns_to_sum的列名分隔符不固定(比如有的是","没有空格),可以把strsplit的分隔符改为"\\s*,\\s*",这样能匹配任意数量的空格:
strsplit(.x, "\\s*,\\s*")[[1]]
运行上述任意一种方法后,都能得到你预期的结果数据框。
内容的提问来源于stack exchange,提问作者Rolotoni
相关产品推荐
相关产品推荐

