R语言批量合并名称相似列:将同前缀多列合并为单列
批量合并R数据框同前缀列(基于coalesce)
示例数据构造
Var1_E1_C1 <- c(1, NA, NA, 1, 1) Var1_E1_C2 <- c(NA, 3, 2, NA, NA) Var23_E2_C1 <- c(NA, 2, NA, 1, 1) Var23_E2_C2 <- c(3, NA, 1, NA, NA) df <- data.frame(Var1_E1_C1, Var1_E1_C2, Var23_E2_C1, Var23_E2_C2)
简洁批量解决方案(tidyverse)
利用tidyr的pivot_longer自动提取列前缀,结合dplyr的coalesce完成合并,无需手动指定40组列名:
library(dplyr) library(tidyr) result <- df %>% pivot_longer( everything(), names_to = c("prefix", ".value"), # 正则匹配:提取_C1/_C2之前的部分作为分组前缀 names_pattern = "(.*)_C\\d+" ) %>% group_by(prefix) %>% summarise(across(everything(), ~coalesce(!!!.x))) %>% pivot_wider(names_from = prefix, values_from = everything())
另一种基础循环实现
如果偏好基础循环写法,可通过提取前缀批量处理:
library(dplyr) # 自动提取所有待合并的列前缀 prefixes <- unique(sub("_C\\d+$", "", colnames(df))) # 批量合并每组前缀对应的列 result <- bind_cols( lapply(prefixes, function(p) { df %>% select(starts_with(p)) %>% coalesce(!!!.) %>% as.data.frame() %>% setNames(p) }) )
验证结果
运行后得到目标数据框:
print(result) # Var1_E1 Var23_E2 # 1 1 3 # 2 3 2 # 3 2 1 # 4 1 1 # 5 1 1
内容的提问来源于stack exchange,提问作者Sum_Oan_Kewl
相关产品推荐
相关产品推荐

