Как найти совпадения, если шаблон является строковым символом?
Предположим, у меня есть строковый вектор:
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
вместо вектора в результате.