2017-10-05 119 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