Как найти ключевые слова в символьном векторе? - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в r и пытаюсь найти способ выполнить поиск по ключевому слову по вектору символов.

Я попытался настроить цикл для сравнения ключевых слов с вектором. Когда я запускаю цикл, все, что я получаю, это повторение кода.

for(i in length(keywords)){
result = grep((keywords[i]), colours, value = TRUE)
}

Если я запускаю grep вне цикла и заменяю меня, скажем, 2, я получаю

[1]«зеленый белый красный» «серый белый синий»

который является выходом, который я ищу.

colours = c("blue yellow green",
           "orange brown black",
           "green white red",
           "turquoise brown crimson",
           "maroon purple navy",
           "grey white blue",
           "aquamarine seagreen olive",
           "khaki lemon sienna")

keywords = c("lemon",
             "white",
             "khaki",
             "blue",
             "pink")

for(i in length(keywords)){
result = grep((keywords[i]), colours, value = TRUE)
}

После выполнения кода я хотел бы создать новый вектор с именем result, который в этом примере содержит следующие элементы:

"khaki lemon sienna"
"green white red" 
"grey white blue"
"khaki lemon sienna"
"blue yellow green" 
"grey white blue"

Буду очень признателен за совето том, как это сделать правильно

Ответы [ 2 ]

0 голосов
/ 11 октября 2019
unlist(lapply(keywords, function(k) colours[grepl(k, colours)]))
#OR
colours[unlist(lapply(keywords, grep, colours))]
#[1] "khaki lemon sienna" "green white red"    "grey white blue"    "khaki lemon sienna"
#[5] "blue yellow green"  "grey white blue"   
0 голосов
/ 11 октября 2019

Если мы используем цикл for, убедитесь, что «результат» не заменяется в каждой итерации. Кроме того, length возвращает единственное значение, так что зацикливание на нем - это только последнее значение keywords[length(keywords)], вместо этого оно может быть seq_along (или 1:length(keywords) - предпочтительнее иметь seq_along)

result <- c()
for(i in seq_along(keywords)){
 result <- c(result, grep((keywords[i]), colours, value = TRUE))
 }

result
#[1] "khaki lemon sienna" "green white red"    "grey white blue"  
#[4]  "khaki lemon sienna" "blue yellow green"  "grey white blue"

Здесь мы обновляем «результат», объединяя каждую итерацию и обновляя вектор «результат»


Это также можно сделать без цикла, если мы создадим «ключевые слова» как paste d одиночная строка, разделенная | (ИЛИ - для соответствия любой из строк ключевых слов в векторе 'colors')

...