Данные
data <- c("Big Pool House", "1 Store Warehouse", "Multiple Storage Pool")
Сначала определите ключевые слова для поиска в данных и соответствующие коды
tags <- c("Storage", "Pool", "Warehouse")
ids <- c(102, 101, 103)
Затем используйте
lapply(data, function(x) ids[which(sapply(tags, function(y) grepl(y, x)))])
[[1]]
[1] 101
[[2]]
[1] 103
[[3]]
[1] 102 101
Редактировать 1 с учетом комментария @Valeri Voev относительно аргумента ignore.case
в grepl
.
По умолчанию функция grepl чувствительна к регистру. Если в данных иногда используется ключевое слово в нижнем регистре, а иногда в верхнем регистре, используйте аргумент ignore.case
со значением TRUE
, чтобы функция игнорировала регистр.
Например, если в данных есть слово «пул» в нижнем и верхнем регистре
data <- c("Big Pool House", "1 Store Warehouse", "Multiple Storage pool")
используйте
lapply(data, function(x) {
ids[which(sapply(tags, function(y) grepl(y, x, ignore.case = TRUE)))]
})
Если вы оставите ignore.case = FALSE
(по умолчанию), grepl
не обнаружит, что "пул" в последнем элементе, и ему не будет присвоен код 101.
Изменить 2 , чтобы дополнить ответ двумя дополнительными требованиями ОП, не указанными в вопросе, но в комментарий.
- Чтобы коды были разделены запятыми, вы можете использовать функцию
paste
с collapse = ','
. - Чтобы сделать это фреймом данных, лучше использовать
sapply
вместо lapply
, так что вы получите вывод в виде вектора символов, а не в виде списка.
Все вместе будет
codes <- unname(sapply(data, function(x) {
paste(ids[which(sapply(tags, function(y) grepl(y, x)))], collapse = ",")
}))
data.frame(Data = data, Codes = codes)
Data Codes
1 Big Pool House 101
2 1 Store Warehouse 103
3 Multiple Storage Pool 102,101