2015-05-24 85 views
2

VAR1是字符向量- [R匹配字符向量

var1 <- c("tax evasion", "all taxes", "payment") 

和VAR2是另一個字符向量

var2 <- c("bill", "income tax", "sales taxes") 

想要比較VAR1和VAR2,並提取其具有部分字匹配的條件,爲例如,在這種情況下,期望的答案將是以下字符向量:

"tax evasion", "all taxes", "income tax", "sales taxes" 

I trie d

sapply(var1, grep, var2, ignore.case=T,value=T) 

但沒有得到想要的答案。如何做呢?

謝謝。

回答

1

可能是你需要

lst1 <- strsplit(var1, ' ') 
lst2 <- strsplit(var2, ' ') 

indx1 <- sapply(lst1, function(x) any(grepl(paste(unlist(lst2), 
     collapse="|"), x))) 
indx2 <- sapply(lst2, function(x) any(grepl(paste(unlist(lst1), 
     collapse="|"), x))) 
c(var1[indx1], var2[indx2]) 
#[1] "tax evasion" "all taxes" "income tax" "sales taxes" 

如果有VAR1和VAR2之間相交,包裝與unique爲@ColonelBeauvel在他優雅的解決方案一樣。

+2

謝謝akrun和Beauvel上校。你的答案都很優雅,儘管我個人更喜歡使用較少或沒有其他包的答案。 – user6633625673888

3

你可以做(​​我用magrittr的代碼的清晰度包):

library(magrittr) 

findIn = function(u, v) 
{ 
    strsplit(u,' ') %>% 
     unlist %>% 
     sapply(grep, value=T, x=v) %>% 
     unlist %>% 
     unique 
} 

unique(c(findIn(var1, var2), findIn(var2, var1))) 
#[1] "income tax" "sales taxes" "tax evasion" "all taxes" 
+2

在2分鐘內我實際上有時間複製它並格式化:)我在我身上開發了它,但是您更快,發佈時沒有看到您的答案。順便說一句,如果兩個名單有一個共同的句子,你最後需要獨特的。 –

+1

是的,你是對的,最後需要'獨特'。我不是說你抄襲了。我看到了相似性,所以我評論道。 – akrun

+0

@akrun你爲什麼刪除你的答案? – user6633625673888