You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:25:23