Есть ли способ выборочно применять эту функцию stringr? - PullRequest
3 голосов
/ 17 апреля 2020

У меня есть пользователей с одним столбцом, в котором указано их самоотчетное местоположение. Из-за этого некоторые местоположения, о которых сообщают, являются бессмысленными, но могут привести к ложному срабатыванию при сопоставлении этого столбца с другими столбцами известных местоположений. Ниже приведен пример фрейма данных.

data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL", "Mobile,AL", "ALL OVER"))

С этими данными я затем запускаю этот код ниже, чтобы установить sh совпадения с AL.

library(stringr)
data$match_ab <- str_extract(data[,2], str_c("AL", collapse = "|"))

Это приводит в Хантсвилле и Мобиле корректно идентифицируются как позитивы, но третье совпадение ALL OVER неправильно идентифицируется как совпадение из-за AL в строке.

Есть ли способ адаптировать этот скрипт так, чтобы он обнаруживает совпадения в с, игнорируя строки с буквами, прикрепленными к нужной части строки? Другими словами, может ли это обнаружить AL, в то время как могут быть пробелы или знаки препинания по обе стороны от частичной строки при игнорировании совпадения, если к строке примыкают буквы алфавита?

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 17 апреля 2020

Работает ли это для вас? Если я вас правильно понял:

data$match_ab <- str_extract(data[,2], "\\bAL\\b")

Использование \\b, которое является граничным условием, так что оно не соответствует никому, если за ним следует слово или Согласно документации: символ \ b соответствует пустой строке по любому краю слова

1 голос
/ 17 апреля 2020

Мы также можем использовать stri_extract от stringi

library(stringi)
data$match_ab <- stri_extract(data[,2], regex = "\\bAL\\b") 
1 голос
/ 17 апреля 2020

Просто небольшая настройка соответствия в определенной позиции: добавьте $ после вашего search_item, то есть , которое указывает: оно должно совпадать, если оно присутствует только в конце string.

data$match_ab <- str_extract(data[,2], str_c("AL$", collapse = "|")); data;

  X              Y match_ab
1 1                    <NA>
2 2 Washington, DC     <NA>
3 3 Huntsville, AL       AL
4 4      Mobile,AL       AL
5 5       ALL OVER     <NA>

Предположим, что AL находится в середине строки, тогда это может быть более общим для использования:

data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL, 
                   SOMETHING_AT_THE_END", "Mobile,AL", "ALL OVER")); data;
  X                                    Y
1 1                                     
2 2                       Washington, DC
3 3 Huntsville, AL, SOMETHING_AT_THE_END
4 4                            Mobile,AL
5 5                             ALL OVER

data$match_ab <- str_extract(data[,2], str_c("AL(?!L)", collapse = "|")); data;
  X                                    Y match_ab
1 1                                          <NA>
2 2                       Washington, DC     <NA>
3 3 Huntsville, AL, SOMETHING_AT_THE_END       AL
4 4                            Mobile,AL       AL
5 5                             ALL OVER     <NA>

Где (?!L) означает не !, а затем ? L.

...