R语言基于关键词BAS拆分字符串出现重复结果(FRM_id=1014)
R语言按"BAS"拆分字符串结果重复问题修复
问题根因
重复记录核心来自3个逻辑漏洞,其中FRM_ID=1014重复最明显是多重问题叠加的结果:
- 关联逻辑产生笛卡尔积:拆分得到的宽表
SD_New2仅绑定了FRM_ID字段,和原表SD_New做右连接时,只要FRM_ID相同就会匹配。FRM_ID=1014在原表本身存在2条不同日期的记录,直接匹配后拆分结果直接翻倍。 - 拆分规则兼容性差:用固定格式
" BAS "(前后各1个空格)做分隔符,遇到BAS前后多空格、带标点的场景会漏拆,产生内容高度相似的冗余片段。 - 流程冗余放大重复问题:先固定拆分为5列再转长表、最后统一去重的流程,会产生大量空值、无效片段,进一步提升重复概率。
修复后代码
直接按行完成拆分操作,跳过容易产生笛卡尔积的跨表关联步骤,同时优化拆分规则兼容多空格场景:
if (!require("librarian"))install.packages("librarian") librarian::shelf(stringr,dplyr,tidyr) # 原始测试数据 FRM_ID<-c(1006,1007,1011,1012,1014,1014,1015) FRM_Name<-c("ABMPSNY NSMF BAS SVFNUF SUPFRMSR BAS M&M BAS PBWFR GRJD ABRP BAS SUN PHSRMS", "BSJSJ FJNSNAF BAS LSRSFN BAS NTPA BAS SDSNJ PBRTS ", "KBTSK MSHJNDRS WJPRB JSW STEEL ", "SSJSN PSJNTS TJTSN ABMPSNY ", "EEE FNTFRPRJS BAS CTD NFSTLF ", "EEE FNTFRPRJS BAS CTD. NFSTLF. ", "MSRUTJ SUZUKJ BAS XYX CORP BAS " ) FRM_DATE <- c('1990-02-02','1990-02-05','1990-02-06','1990-02-06','1990-02-06','1990-02-07','1990-02-08') Samp_Data<-data.frame(FRM_ID,FRM_Name,FRM_DATE) # 清洗拆分流程 SD_Melt_clean <- Samp_Data %>% # 过滤包含BAS分隔符的记录,兼容BAS前后多空格场景 filter(grepl("\\s+BAS\\s+", FRM_Name)) %>% # 按行拆分姓名字段,拆分规则兼容BAS前后任意数量空格 mutate(FRM_Name_Split = str_split(FRM_Name, "\\s*BAS\\s*")) %>% # 展开拆分结果为长表,拆分片段和原记录一一对应,不会产生跨记录匹配 unnest(FRM_Name_Split) %>% # 清洗片段首尾空格 mutate(FRM_Name_Split = trimws(FRM_Name_Split)) %>% # 过滤空值、长度不足2的无效片段 filter(nchar(FRM_Name_Split) > 1, FRM_Name_Split != "") %>% # 按ID+日期+片段内容去重,避免同记录内重复片段 distinct(FRM_ID, FRM_DATE, FRM_Name_Split, .keep_all = TRUE) %>% # 整理输出字段 select(FRM_ID, FRM_DATE, FRM_Name = FRM_Name_Split)
效果说明
运行修复代码后,所有拆分片段和原始记录的ID、日期一一绑定,FRM_ID=1014的两条不同日期记录会分别拆分出对应内容,不会出现跨日期匹配导致的翻倍重复,拆分规则也能兼容原数据中多空格、尾部标点的场景,不会漏拆。
内容的提问来源于stack exchange,提问作者BobbyG
相关产品推荐
相关产品推荐

