2017-10-05 62 views
1

我有2个矢量,其被从regex各种应用中产生特定的模式:递归匹配并使用AGREP替换字符串到向量元素()

> v1 <- c('abc', 'efg', 'hijk', 'mno') 
> v2 <- c('abcde', 'ijklm') 

我想在v2中的字符串匹配V1用agrep()

> agrep(v2[1], v1, max.distance = 2) 
[1] 1 

> agrep(v2[2], v1, max.distance = 2) 
[1] 3 

使得最接近V2在V1中的元件可以通过v2的代替,以得到以下矢量:

> rslt <- c('abcde', 'efg', 'ijklm', 'mno') 
[1] "abcde" "efg" "ijklm" "mno" 

我可能需要一个函数来更改max.distance数字,以便找到最接近的匹配项。

回答

2

你可以做这样的事情:

sapply(v1, function(x) {ifelse(length(agrep(x, v2)) > 0, agrep(x, v2, value = TRUE), x)}) 

将返回:

abc  efg hijk  mno 
"abcde" "efg" "ijklm" "mno" 

注意,如果输入例如包含两个“ABC”和“ABCD”,两者都将被替换'ABCDE'。我认为这是所需的行为?希望这可以帮助!

+2

你也可以做'agrep(x,v2,value = TRUE)'而不是'v2' – Sotos

+1

看起来确实是一个更清洁的解决方案,相应地修改了答案。 – Florian

+0

这段代码的功能部分是如何工作的? – Sati