如何用R正则批量筛选含相同T标识的列并排除同名重复列?
解决方案
针对步骤1:批量处理任意数量的T编号
不用手动逐个指定T0、T1这类编号,可以自动提取所有符合条件的分组并合并:
首先加载依赖包:
library(dplyr) library(purrr)
然后执行以下代码:
# 解析列名,筛选出|两侧T编号相同的列,并按T编号分组 col_details <- tibble(col_name = names(means2)) %>% # 捕获|前后的T编号 extract(col_name, into = c("t_left", "t_right"), regex = ".*_T(\\d+)\\|.*_T(\\d+)", remove = FALSE) %>% # 只保留两侧T编号一致的列 filter(t_left == t_right) %>% # 生成分组标识(比如T0、T1) mutate(t_group = paste0("T", t_left)) # 按分组批量筛选列、添加行id,再合并成最终数据框 means3 <- col_details %>% # 按T分组拆分 group_split(t_group) %>% # 对每个分组处理:筛选列+添加行id map(function(group_data) { means2 %>% select(all_of(group_data$col_name)) %>% rownames_to_column("id_cp_interaction") }) %>% # 批量合并所有分组的结果 reduce(full_join, by = "id_cp_interaction")
不管你有多少个T编号(比如T2、T3、T10...),这段代码都会自动识别并处理,完全不用手动修改。
针对步骤2:筛选|两侧前缀不同的列
可以通过正则捕获|前后的完整部分,直接筛选出两侧内容不一样的列,两种实现方式:
方式1:在步骤1之后二次筛选
如果已经得到了步骤1的means3,可以这样处理:
# 提取需要判断的列(排除id列) cols_to_check <- setdiff(names(means3), "id_cp_interaction") # 筛选出|两侧内容不同的列 valid_cols <- tibble(col_name = cols_to_check) %>% extract(col_name, into = c("left_part", "right_part"), regex = "(.*)\\|(.*)", remove = FALSE) %>% filter(left_part != right_part) %>% pull(col_name) # 得到最终结果 means_final <- means3 %>% select(id_cp_interaction, all_of(valid_cols))
方式2:一步到位(同时满足步骤1和步骤2的条件)
如果你想直接得到同时符合两个条件的结果,可以把筛选逻辑合并到第一步:
col_details <- tibble(col_name = names(means2)) %>% # 同时捕获|前后的完整部分和T编号 extract(col_name, into = c("left_full", "t_left", "right_full", "t_right"), regex = "(.*_T(\\d+))\\|(.*_T(\\d+))", remove = FALSE) %>% # 同时满足:T编号相同,且前后完整部分不同 filter(t_left == t_right, left_full != right_full) %>% mutate(t_group = paste0("T", t_left)) # 后续合并步骤和之前一致 means_final <- col_details %>% group_split(t_group) %>% map(function(group_data) { means2 %>% select(all_of(group_data$col_name)) %>% rownames_to_column("id_cp_interaction") }) %>% reduce(full_join, by = "id_cp_interaction")
这样直接输出的means_final就是同时满足两个要求的数据框。
内容的提问来源于stack exchange,提问作者Seigfried
相关产品推荐
相关产品推荐

