R语言数据处理需求:基于带后缀的列组生成前缀命名列并插入指定位置
实现需求的R语言代码方案
我给你分享一个基于tidyverse工具链的实现方案,逻辑清晰且易于维护,完全匹配你的需求:
library(tidyverse) # 构造输入的tibble数据 input_tbl <- structure( list( `1.a` = c("a", NA, "a"), `1.b` = c("b", "b", NA), `2` = c("ba", "ba", "ab"), `3.a` = c("a", "a", NA), `3.b` = c("b", NA, "b") ), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame") ) # 提取所有需要处理的组标识(即.a/.b后缀前的数字) target_groups <- input_tbl %>% colnames() %>% str_extract("^\\d+(?=\\.[ab]$)") %>% # 匹配.a/.b前的数字 discard(is.na()) %>% # 过滤掉非目标列的结果 unique() # 去重得到唯一的组号 # 批量处理每个组,插入拼接后的新列 output_tbl <- target_groups %>% reduce( .init = input_tbl, .f = function(current_tbl, group_num) { # 找到当前组.a列的位置,用于插入新列 a_col_position <- which(colnames(current_tbl) == str_glue("{group_num}.a")) # 生成当前组的拼接列:合并.a和.b列,忽略NA值 combined_column <- current_tbl %>% select(starts_with(str_glue("{group_num}."))) %>% rowwise() %>% mutate(!!group_num := str_c(c_across(everything()), collapse = "", na.rm = TRUE)) %>% pull(!!group_num) # 在.a列前插入新生成的组列 current_tbl %>% mutate(!!group_num := combined_column, .before = a_col_position) } ) # 查看最终结果 output_tbl
代码逻辑说明:
- 提取组标识:通过正则表达式从列名中匹配出所有带
.a/.b后缀的组号,确保只处理我们需要的列组; - 批量处理组:用
reduce函数循环处理每个组,避免重复编写相同逻辑; - 拼接单元格值:使用
rowwise()配合c_across()按行读取组内的.a/.b列值,再用str_c()拼接时开启na.rm = TRUE自动忽略NA; - 插入新列:通过
.before参数精准将新列插入到对应组的.a列前面,保证列顺序符合要求。
运行代码后得到的结果完全符合你给出的目标数据结构。
内容的提问来源于stack exchange,提问作者persephone
相关产品推荐
相关产品推荐

