2015-05-24 4 views
2

var1 является характер векторомR Match характер векторы

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

Смежные вопросы