如何使用dplyr对两组列的对应位置元素分别求和
实现方案
以下是两种可适配动态列数的dplyr实现方案,无需手动逐列编写求和逻辑,两组列数为任意相等值都可直接运行:
首先加载所需依赖包:
library(dplyr) library(purrr) library(stringr) # 仅自定义列名格式时需要
方法1:按列名特征筛选两组列
如果你的两组列名有统一的区分规则(比如示例里第一组以a开头,第二组以b开头),用这个方法最灵活:
# 第一步:定义两组列的筛选规则,可替换为任意dplyr列选择器 cols_g1 <- starts_with("a") # 第一组列的筛选条件,可换成ends_with、matches、直接写列名列表等 cols_g2 <- starts_with("b") # 第二组列的筛选条件 resultado <- teste %>% # 按位置一一对应求和,生成新列 mutate(!!!map2( select(cur_data(), all_of(cols_g1)), select(cur_data(), all_of(cols_g2)), ~ .x + .y ) %>% # 自定义新列的命名规则,可按需修改 set_names(paste0("a_b", seq_along(.)))) %>% # 仅保留生成的结果列,不需要可以删除这行 select(starts_with("a_b"))
方法2:按列位置拆分
如果你的两组列是按固定顺序排列(比如前N列是第一组,后N列是第二组),可以用这个方法:
# 自动计算单组列数,无需手动写死 group_n <- ncol(teste) / 2 resultado <- teste %>% # 两组列按位置一一对应求和,直接生成结果 transmute(across(1:group_n, .names = "a_b{col}") + across((group_n+1):(2*group_n))) %>% # 可选:调整列名格式为a_b1、a_b2的样式,不需要可以删除这行 rename_with(~ str_replace(., "a_b.*(\\d)$", "a_b\\1"))
两种方法在你给出的示例数据上运行,都可以得到期望的输出结果。
内容的提问来源于stack exchange,提问作者jorgep
相关产品推荐
相关产品推荐

