You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:31:06