如果模式是字符串字符,如何找到匹配项?

3
假设我有一个字符串向量:
header = c("2012 Chevrolet Camaro SS", 
           "2013 Chevrolet Equinox LT", 
           "2013 Nissan Altima 2.5 SV", 
           "2009 Infiniti M35x X")

以及汽车制造商列表

maker.list = c("Chevrolet", "Nissan", "Infiniti")

我希望使用agrep()函数来返回汽车制造商在头部每个元素中出现位置的索引。我希望它能够返回结果。
idx = c(2, 2, 2, 2) #the makers' name occurs at the 2nd position of each element 

由于模式是字符串列表,我考虑使用mapply或lapply循环遍历它。或者使用r命令将制造商名称更改为正则表达式,例如

regexp = "Chevrolet|Nissan|Infiniti" 

到目前为止,我已经:

idx = lapply(maker.list, function(permaker){
   match.result = agrep(permaker, header, max.distance = 1)
   return (match.result)
})

这显然行不通... 有什么想法吗?

-----------------------------更新---------------------------------- 我尝试了下面的解决方案,发生了一些奇怪的事情。

maker.list1 = c("zap", "ford")
lapply(maker.list1, agrep, c("2011" ,"Ford", "Escape"), max.distance = 1, ignore.case = TRUE)

结果是

[[1]]
[1] 3

[[2]]
[1] 2

这个说法两个都匹配,对我来说没有意义,我有什么遗漏的吗? 注:在我的实际情况下,我有大约70个汽车制造商和超过4k个头文件。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - polka
@polka 不,它们可能不在同一个地方。我的目标是提取汽车型号而不是汽车制造商。我手头只有一份汽车制造商清单,而汽车型号紧随其后,因此我想知道汽车制造商的索引以便找到汽车型号。 - user3697665
关于您的评论 - agrepl("zap", "Escape") 返回 TRUE - thelatemail
1个回答

2

strsplit将您的header中的每个项目按空格分隔,然后对每个项目运行agrep:

sapply(strsplit(header, "\\s+"), function(H) unlist(lapply(maker.list, agrep, H)) )
#[1] 2 2 2 2

如果一个案例有多个匹配结果,你将会得到一个列表而不是向量作为结果。

是的,我的情况下有多个匹配结果,但没关系。非常感谢! - user3697665
我刚遇到了一个关于结果的奇怪问题,你想看看我的更新吗? - user3697665
@user3697665 - 你已经完全理解了这段代码 - lapply(strsplit("2011 Ford Escape", "\\s+"), function(H) unlist(lapply(maker.list1, agrep, H)) ) 的输出结果是 3 2,因为 zap 几乎匹配了 Esc*ap*e,而 ford 匹配了 Ford - thelatemail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接