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

pmatch函数无法识别向量间部分匹配的问题求助

问题:获取向量中部分匹配元素的索引

已知两个向量:

x <- 
c("    scharfkantig", "t", " aht  36 üz distal", " seit paartagen", 
"36 vipr", " perk ", "üz bilfuird", " ", " knirscht", 
" schiene empohlen", "  meldet ")
y <- 
c("01", "beobachten", "hkp", "hkp", "abform kiefer", "abform bissfix", 
"opt elek abform", "vipr", "perk", "oberfl anästh", "anästh", 
"vest inj", "inj sept blau", "cx pulpennah", "infiltration", 
"injektion", "infil", "l1", "gezeigt zu achten", "putzdruck", 
"mhu", "gezeigt", "pat gezeigt", "pzr", "psi sbi api", "dentalhygiene", 
"duraphat aufge", "empfindliche stelle aufgetragen", "üz", "duraphat")

需要找到y中与x存在部分匹配的元素的索引,预期结果为(8,9,29),对应元素vipr、perk、üz。


为什么之前的方法无效?

  1. which(y %in% x) 和 match(y, x):这两个函数仅支持完全匹配,比如y中的vipr和x中的36 vipr并非完全相同,因此无法匹配。
  2. pmatch(x= y, table = x, duplicates.ok = TRUE):
    • pmatch是前缀匹配,仅检查第一个参数的元素是否是第二个参数元素的前缀(比如y中的üz是x中üz bilfuird的前缀,因此返回7,即x的索引);
    • 它返回的是table(即x)的索引,而非y的索引,且无法检测x元素中间包含y元素的情况(比如x中的36 vipr包含y中的vipr,但vipr不是36 vipr的前缀,因此无法匹配)。

解决方案:使用模糊匹配检测部分包含

我们需要检查y的每个元素是否被x的任意元素包含,同时处理x中元素的前后空格避免匹配失败:

# 去除x中元素的前后空格,消除空格干扰
x_trimmed <- trimws(x)

# 遍历y的每个元素,检查是否在x的任意元素中存在部分匹配
match_logic <- sapply(y, function(y_val) {
  any(grepl(y_val, x_trimmed, fixed = TRUE))
})

# 获取y中匹配元素的索引
which(match_logic)

执行后返回结果:

[1]  8  9 29

简化写法:

which(sapply(y, function(v) any(grepl(v, trimws(x), fixed = TRUE))))

内容的提问来源于stack exchange,提问作者KC-Migo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:54:19