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

在R中基于字符串不同位置条件过滤并处理ID去重

R字符串列筛选:按中间6位ID去重并按优先级保留记录

解决方案思路

核心是先精准提取中间6位的唯一ID,再按规则完成过滤、排序后分组去重。用tidyverse工具链(dplyr+stringr)可以高效实现需求。

代码实现

# 加载必要工具包
library(tidyverse)

# 构造示例输入数据
df <- tibble(col1 = c(
  "ID-1-AMBCFG-07A-01",
  "ID-1-CGUMBD-08A-01",
  "ID-1-XDUMNG-07B-01",
  "ID-1-XDUMNG-08B-01",
  "ID-1-LOFBUM-02A-01",
  "ID-1-ABYEMJ-08A-01",
  "ID-1-ABYEMJ-08B-01"
))

# 完整处理流程
result <- df %>%
  # 1. 排除所有含"02"的记录
  filter(!str_detect(col1, "02")) %>%
  # 2. 提取关键信息:唯一ID、优先级判断用的数字和字母
  mutate(
    # 正则提取"ID-1-"后的6位字符作为唯一ID
    unique_id = str_extract(col1, "(?<=ID-1-).{6}"),
    # 提取数字部分(07/08)用于优先级排序
    priority_num = str_extract(col1, "07|08"),
    # 提取字母部分(A/B)用于优先级排序
    priority_char = str_extract(col1, "A|B")
  ) %>%
  # 3. 按唯一ID分组,按规则排序(07优先于08,A优先于B)
  group_by(unique_id) %>%
  arrange(priority_num, priority_char) %>%
  # 每组仅保留第一条(优先级最高的记录)
  slice_head(n = 1) %>%
  # 清理辅助列,保留原字符串列
  ungroup() %>%
  select(col1)

# 输出结果
print(result)

代码细节说明

  • 过滤含"02"的记录:用str_detect检测字符串中的"02",取反后完成过滤。
  • 提取唯一ID:正则表达式(?<=ID-1-).{6}利用正向预查,精准定位"ID-1-"之后的6个字符,解决你提到的「无法指定字符串位置」的问题。
  • 优先级排序:通过提取数字和字母作为排序键,arrange默认升序排列,确保07排在08前、A排在B前,让每组内优先级最高的记录处于首位。
  • 分组去重:按unique_id分组后,用slice_head保留每组第一条,实现「同一ID仅留一条优先记录」的需求。

运行结果

# A tibble: 4 × 1
  col1                 
  <chr>                
1 ID-1-AMBCFG-07A-01
2 ID-1-CGUMBD-08A-01
3 ID-1-XDUMNG-07B-01
4 ID-1-ABYEMJ-08A-01

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:21:35