2017-10-05 8 views
1

I have 2 vecteurs, qui sont générés à partir de l'application variée de regex à un certain motif:correspondre de manière récursive et remplacer des chaînes à l'élément de vecteur en utilisant agrep()

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

Je souhaite faire correspondre les chaînes de v2 à v1 utilisant agrep(),

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

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

de telle sorte que l'élément en v1 qui est le plus proche de v2 peut être remplacé par v2, pour donner le vecteur suivant:

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

Je pourrais avoir besoin d'une fonction pour faire varier le nombre max.distance de sorte que la correspondance la plus proche puisse être trouvée.

Répondre

2

Vous pouvez faire quelque chose comme ceci:

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

qui retourne:

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

Notez que si l'entrée contient par exemple à la fois « abc » et « ABCD », les deux seront remplacés par 'abcde'. Je suppose que c'est le comportement souhaité? J'espère que cela t'aides!

+2

vous pouvez aussi faire 'agrep (x, v2, value = TRUE)' au lieu de 'v2 [...]' – Sotos

+1

Cela ressemble à une solution plus propre en effet, a modifié la réponse en conséquence. – Florian

+0

Comment fonctionne la partie fonction de ce code? – Sati