在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
相关产品推荐
相关产品推荐

