Как найти совпадения, если шаблон является строковым символом?

Предположим, у меня есть строковый вектор:

header = c("2012 Chevrolet Camaro SS", 
           "2013 Chevrolet Equinox LT", 
           "2013 Nissan Altima 2.5 SV", 
           "2009 Infiniti M35x X")

и список автопроизводителей

maker.list = c("Chevrolet", "Nissan", "Infiniti")

Я хочу использовать agrep(), чтобы вернуть индекс того, где автопроизводитель появляется в каждом элементе в заголовке. Я хочу это вернуть

idx = c(2, 2, 2, 2) #the makers' name occurs at the 2nd position of each element 

Поскольку шаблон - это список строк, я думаю использовать mapply или lapply для его повторения. Или, возможно, используйте команду r, чтобы изменить имена создателей на регулярные выражения, такие как

regexp = "Chevrolet|Nissan|Infiniti" 

Пока что у меня есть:

idx = lapply(maker.list, function(permaker){
   match.result = agrep(permaker, header, max.distance = 1)
   return (match.result)
})

Это явно не работает... Есть идеи?

-----------------------------Обновить-------------------- ------------ Я попробовал одно из приведенных ниже решений, и случилось нечто странное.

maker.list1 = c("zap", "ford")
lapply(maker.list1, agrep, c("2011" ,"Ford", "Escape"), max.distance = 1, ignore.case = TRUE)

результат

[[1]]
[1] 3

[[2]]
[1] 2

который говорит, что оба матча, это не имеет смысла для меня, я что-то упустил? PS: В моем случае у меня около 70 автопроизводителей и более 4 тыс. заголовков.

1 ответ

Решение

strsplit каждый элемент в вашем header по пробелам, а затем запустить agrep через каждого:

sapply(strsplit(header, "\\s+"), function(H) unlist(lapply(maker.list, agrep, H)) )
#[1] 2 2 2 2

Если вы получите несколько попаданий в любом случае, вы получите list вместо вектора в результате.

Другие вопросы по тегам