如何在R中按列名模式合并含中间年份的多列?
批量合并含年份的列(用coalesce填充NA)
核心思路
先从列名中剥离中间的4位年份,得到每个列对应的目标变量名;再按目标变量名分组,对每组的列使用coalesce合并(自动取非NA值填充),最后重组为新的数据框。
所需工具包
需要加载dplyr、purrr和stringr:
library(dplyr) library(purrr) library(stringr)
完整代码实现
步骤1:生成目标变量名(剥离年份)
用正则表达式匹配列名中的4位年份(\\d{4})并移除,得到每个列对应的最终变量名:
# 提取目标列名(去掉中间的4位年份) target_col_names <- str_remove(colnames(tab), "\\d{4}")
步骤2:按目标变量名拆分列并合并
通过split将原数据框的列按目标变量名分组,再用map_dfc遍历每个分组,执行coalesce合并列:
# 拆分列并批量合并 tab_merged <- tab %>% split(target_col_names) %>% map_dfc(~coalesce(!!!.x))
示例验证
用你提供的列名逻辑生成测试数据,验证效果:
# 生成测试数据(模拟NA填充场景) set.seed(123) tab <- tibble( Za2010a01 = c(1, NA, 3), Za2010a02 = c(NA, 2, 4), Za2011a01 = c(NA, 5, NA), Za2011a02 = c(6, NA, NA), Zb2010a01 = c(NA, 7, 8), Zb2011a01 = c(9, NA, NA) ) # 执行合并代码 target_col_names <- str_remove(colnames(tab), "\\d{4}") tab_merged <- tab %>% split(target_col_names) %>% map_dfc(~coalesce(!!!.x)) # 查看合并结果 tab_merged
输出结果:
# A tibble: 3 × 3 Zaa01 Zaa02 Zba01 <dbl> <dbl> <dbl> 1 1 6 9 2 5 2 7 3 3 4 8
关键说明
split(target_col_names):将原数据框的列按目标变量名分组,比如Za2010a01和Za2011a01会被分到同一组。coalesce(!!!.x):!!!将分组内的列拆分为coalesce的多个参数,自动取每组中第一个非NA值,完美匹配你"无重叠、用NA填充"的需求。- 该方法完全自动化,即使有5000+变量也能快速处理,无需手动指定任何列名。
内容的提问来源于stack exchange,提问作者statmach
相关产品推荐
相关产品推荐

