Мы можем использовать grep
/ grepl
здесь, вставив строку allergens1
и allergens2
вместе в один шаблон. Если menu
соответствует любому элементу в allergens1
, мы присваиваем значение "nuts"
, а если соответствует любому элементу в allergens2
, мы присваиваем "shellfish"
category
.
mydf$category[grep(paste0('\\b', allergens1, '\\b', collapse = '|'), mydf$menu)] <- 'nuts'
mydf$category[grep(paste0('\\b', allergens2, '\\b', collapse = '|'), mydf$menu)] <- 'shellfish'
mydf
# menu category
#1 chicken with peanut sauce nuts
#2 sole and clam chowder <NA>
#3 shrimp salad shellfish
Мы также можем использовать case_when
с str_detect
, чтобы сделать это tidyverse
способом.
library(dplyr)
library(stringr)
mydf %>%
mutate(category = case_when(
str_detect(menu, str_c('\\b', allergens1, '\\b', collapse = '|'))~'nuts',
str_detect(menu, str_c('\\b', allergens2, '\\b', collapse = '|'))~'shellfish'))
Мы добавляем границы слов (\\b
), чтобы избежать совпадения "cashew"
с "cashewnut"
. Удалите их, если вы хотите, чтобы они были сопоставлены.