#r
#r
Вопрос:
Предположим, у меня есть файл Excel, и я прочитал его как фрейм данных и загрузил в R. Один из столбцов представляет собой текстовый столбец, содержащий одно или несколько слов. Я должен найти, содержит ли ячейка конкретный город, указанный в «City_Vector» (например c("New York", "Beijing", "Paris", "London")
, и извлечь его (или извлечь первое совпадение / все совпадения). В Excel я использовал пользовательскую функцию и получил что-то подобное:
| For Moscow State University |
должен вернуться Moscow
; | asdsadsadsaWarsawsdaqq |
должен вернуться Warsaw
Я попытался разделить строку и использовать %in%
, но, похоже, это не лучшее решение. Спасибо!
Ответ №1:
Если целью является извлечение совпадений независимо от регистра, то это должно сработать:
Данные:
City_Vector <- c("New York", "Bejing", "Paris", "London", "Moscow", "Warsaw")
cities <- c('Moscow State University','asdsadsadsaWarsawsdaqq',
'New York Philhamonics', 'food in Bejing', 'parisclimateaccord')
Решение:
library(stringr)
str_extract(cities, paste0("(?i)(", paste0(City_Vector, collapse = "|"), ")"))
Объяснение:
Суть здесь в том, чтобы сформулировать все возможные названия городов в виде шаблона альтернатив (обратите внимание на маркер чередования |
), используя вложенные paste0
команды.
Редактировать:
(?i)
используется для того, чтобы сделать шаблон нечувствительным к регистру.
Комментарии:
1. Спасибо! Но как насчет того, чтобы сделать его не чувствительным к регистру? Или это возможно только тогда, когда мы добавляем к вектору города оба
Warsaw
иwarsaw
?2. Или просто используйте
tolower()
и работайте со строчными строками3. Отредактировали ответ, чтобы сделать шаблон нечувствительным к регистру. Пожалуйста, рассмотрите возможность принятия и / или голосования.
Ответ №2:
Используйте str_extract()
из stringr
пакета.
Слишком простой пример:
cityVec <- c('Moscow State University','asdsadsadsaWarsawsdaqq')
str_extract(cityVec, 'Moscow')
Комментарии:
1. Это только проверяет, есть ли совпадение для
Moscow
, но не для любого другого названия города