如何按表头名称合并多列?两种合并场景求助
R实现Excel列的两种合并方案
先构造与你提供的Excel结构一致的示例数据:
# 模拟原Excel数据 df <- data.frame( A1 = c(1,2,3,4,NA,NA), A2 = c(5,6,7,8,9,10), B1 = c(11,12,13,NA,NA,NA), B2 = c(14,NA,NA,NA,NA,NA), B3 = c(15,16,17,18,NA,NA), C1 = c(19,20,21,NA,NA,NA), C2 = c(22,23,24,25,26,27), # 补充H系列空列,还原原数据结构 H1 = rep(NA,6), H2=rep(NA,6), H3=rep(NA,6), H4=rep(NA,6), H5=rep(NA,6), H6=rep(NA,6), H7=rep(NA,6), H8=rep(NA,6), H9=rep(NA,6), H10=rep(NA,6), H11=rep(NA,6), H12=rep(NA,6) )
方案1:按表头中的数字合并列
将所有表头包含相同数字的列合并,最终生成12列(对应数字1-12):
library(tidyverse) df_num_merge <- df %>% # 宽表转长表,拆分列名与数值 pivot_longer(everything(), names_to = "col", values_to = "val") %>% # 提取列名中的数字部分 mutate(num = str_extract(col, "\\d+") %>% as.integer()) %>% # 过滤空值 filter(!is.na(val)) %>% # 按数字分组,收集每组的所有非空值 group_by(num) %>% summarise(values = list(val)) %>% # 按数字排序,确保列顺序为1-12 arrange(num) %>% # 转回宽表,设置列名为Column X pivot_wider(names_from = num, values_from = values, names_prefix = "Column ") %>% # 展开列表,长度不足的位置补NA unnest_wider(everything(), names_sep = "") %>% # 强制按Column 1到Column 12的顺序排列 select(paste0("Column ", 1:12)) # 打印结果(空值显示为空白) print(df_num_merge, na.print = "")
方案2:按表头的字母前缀合并列
将所有以相同字母开头的列合并,最终生成8列(对应A-H):
df_letter_merge <- df %>% pivot_longer(everything(), names_to = "col", values_to = "val") %>% # 提取列名中的字母前缀 mutate(letter = str_extract(col, "[A-Z]")) %>% filter(!is.na(val)) %>% # 按字母分组,收集每组非空值 group_by(letter) %>% summarise(values = list(val)) %>% # 按字母顺序排序 arrange(letter) %>% pivot_wider(names_from = letter, values_from = values, names_prefix = "Column ") %>% unnest_wider(everything(), names_sep = "") %>% # 强制按Column A到Column H的顺序排列 select(paste0("Column ", LETTERS[1:8])) # 打印结果(空值显示为空白) print(df_letter_merge, na.print = "")
为什么直接用rbind失败?
rbind是按行拼接数据框,要求待拼接的对象列数一致、结构匹配。而你的需求是将同一组列的非空值按顺序堆叠,需要先把列转成行、分组收集值,再转回宽表,直接用rbind无法处理不同长度的列分组逻辑。
内容的提问来源于stack exchange,提问作者Hotshot
相关产品推荐
相关产品推荐

