R语言实现列内字符串无序匹配并提取匹配结果生成目标数据框
实现方案
核心思路
- 先将每个逗号分隔的字符串拆分为无序的元素集合
- 生成列所有值的两两比对组合(笛卡尔积)
- 对每对组合计算元素交集,按规则返回匹配结果:
- 两个集合元素完全一致(长度相等且交集长度等于集合长度)返回
Complete Match - 交集为空返回
NO Matching - 其余情况返回逗号拼接的交集元素
- 两个集合元素完全一致(长度相等且交集长度等于集合长度)返回
完整实现代码
# 输入数据 Col_1 = c("AB,CD,EF","AB,CD,EF,GH","MN,OP","AB,MN,OP","OP,MN,AB") df_input = data.frame(Col_1, stringsAsFactors = FALSE) # 自定义匹配函数 calc_match <- function(x, y) { # 拆分字符串为元素向量 x_vec <- strsplit(x, ",")[[1]] y_vec <- strsplit(y, ",")[[1]] # 求交集 common <- intersect(x_vec, y_vec) # 按规则返回结果 if (length(common) == 0) { return("NO Matching") } else if (length(x_vec) == length(y_vec) && length(common) == length(x_vec)) { return("Complete Match") } else { return(paste(common, collapse = ",")) } } # 生成所有两两比对组合 df_out <- expand.grid(Col_1 = df_input$Col_1, Col_2 = df_input$Col_1, stringsAsFactors = FALSE) # 逐行计算匹配结果 df_out$match <- mapply(calc_match, df_out$Col_1, df_out$Col_2) # 输出结果和示例预期完全一致 print(df_out)
说明
你之前用grepl无法实现是因为grepl是基于顺序的字符串模糊匹配,无法处理元素无序、提取交集的需求,必须先将字符串拆分为独立元素再做集合运算才能满足要求。
内容的提问来源于stack exchange,提问作者san1
相关产品推荐
相关产品推荐

