如何对DataFrame中的交替列对批量应用unite()合并操作?
批量合并交替列对的tidyverse实现方案
针对你描述的DataFrame结构(Date列为首,后续按「地区列-通用列」交替排列),可以通过列分组+reduce批量执行unite的方式实现需求,具体步骤如下:
1. 准备工作(加载包+构造示例数据)
library(tidyverse) # 构造与你结构一致的示例数据 df <- tibble( Date = c("2021-04-01", "2021-04-02", "2021-04-03"), England = c(145, 200, 120), ...3 = c("e", "e", ""), Wales = c(23, 90, 66), ...5 = c("", "s", "e") )
2. 核心处理逻辑
# 提取除Date外的列名,按每2列一组拆分(对应「地区列-通用列」对) cols_to_group <- names(df)[-1] col_groups <- split(cols_to_group, ceiling(seq_along(cols_to_group)/2)) # 批量执行unite合并操作 result_df <- col_groups %>% reduce( .init = df, ~ unite( .x, col = !!names(.y)[1], # 新列名沿用原地区列的名称 all_of(.y), # 指定当前组要合并的两列 sep = "-", # 设置分隔符为横杠 remove = TRUE # 合并后删除原列 ) )
3. 关键细节说明
- 如果你的原始数据中空值以
NA形式存在而非空白字符串,需先将NA替换为空,避免合并后出现120-NA这类结果:df_clean <- df %>% mutate(across(-Date, ~ replace_na(.x, ""))) # 之后用df_clean替代df执行后续分组和reduce操作 split(cols_to_group, ceiling(seq_along(cols_to_group)/2))自动将交替列按顺序两两分组,适配你190组地区列的场景;reduce函数会从原始DataFrame开始,依次对每个列组执行合并,最终得到保留Date列、所有地区列与对应通用列合并后的结果。
最终结果示例
执行后result_df的结构如下:
| Date | England | Wales |
|---|---|---|
| 2021-04-01 | 145-e | 23- |
| 2021-04-02 | 200-e | 90-s |
| 2021-04-03 | 120- | 66-e |
内容的提问来源于stack exchange,提问作者William Wormell
相关产品推荐
相关产品推荐

