如何在R数据框中合并具有相同后缀的列?
按后缀合并R数据框列的实现方法
这里给你两种实用的tidyverse方案,都用到了你提到的unite()函数,轻松搞定相同后缀列的合并:
方案一:长表转宽表法(更直观)
先把宽格式数据转成长格式,拆分列名的前缀和后缀,合并后再转回宽格式:
# 加载包 library(tidyverse) # 构造示例数据框 df <- tibble( Forename_1 = "Joe", Surname_1 = "Bloggs", Forename_2 = "Dave", Surname_2 = "Jones" ) # 核心处理代码 result <- df %>% # 把所有列转成长表,拆分列名为前缀(Forename/Surname)和后缀(1/2) pivot_longer( everything(), names_to = c("prefix", "suffix"), names_sep = "_" ) %>% # 按后缀分组 group_by(suffix) %>% # 合并同一后缀的两个值为全名 mutate(fullname = str_c(value, collapse = " ")) %>% ungroup() %>% # 保留需要的列并去重 select(suffix, fullname) %>% distinct() %>% # 转回宽格式,添加Fullname前缀 pivot_wider( names_from = suffix, values_from = fullname, names_prefix = "Fullname_" ) print(result)
运行后输出:
# A tibble: 1 × 2 Fullname_1 Fullname_2 <chr> <chr> 1 Joe Bloggs Dave Jones
方案二:按后缀筛选列合并法(更直接)
直接提取所有唯一后缀,循环筛选对应列并合并:
library(tidyverse) df <- tibble( Forename_1 = "Joe", Surname_1 = "Bloggs", Forename_2 = "Dave", Surname_2 = "Jones" ) # 提取所有唯一的后缀(比如_1、_2) suffixes <- unique(str_remove(colnames(df), "^.*_")) # 循环每个后缀,合并对应列并拼接结果 result <- map_dfc(suffixes, function(suf) { df %>% # 筛选以当前后缀结尾的列 select(ends_with(suf)) %>% # 合并为Fullname_后缀的列,用空格分隔 unite(paste0("Fullname_", suf), everything(), sep = " ") }) print(result)
这个方案直接用ends_with()定位同后缀列,再用unite()完成合并,逻辑更贴近你一开始的思路。
内容的提问来源于stack exchange,提问作者jake
相关产品推荐
相关产品推荐

