Как назначить числовой код для строки на основе набора ключевых слов в R - PullRequest
1 голос
/ 08 февраля 2020

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

  1. большой Дом у бассейна

  2. 1 хранилище этажа

  3. несколько пулов хранения

Теперь я хочу закодировать текстовые описания на основе подстрок. Например, если в тексте есть строка «пул», то я хочу назначить числовой код (скажем, 101) всему текстовому описанию.

Если в текстовом описании (скажем, несколько строк) , «хранилище» и «пул»), затем я хочу назначить несколько кодов для этих описаний и объединить / вставить коды. Например, в случае описания - «пул нескольких хранилищ», я бы назначил код (скажем, 102) для хранилища и 101 для пула. Таким образом, результат должен быть (102, 101).

Может ли кто-нибудь предложить алгоритм R для этого?

1 Ответ

1 голос
/ 08 февраля 2020

Данные

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
...