#r #string #dplyr #stringr #mapply
Вопрос:
У меня есть фрейм данных, содержащий столбец с именами брокеров, написанными от руки клиентами, которые я хотел бы просмотреть, чтобы заменить написанные от руки имена брокеров уникальными именами брокеров, которые у меня есть в списке.
Фрагмент моих данных выглядит так:
Data <- data.frame(Date = c("01-10-2020", "01-10-2020", "01-11-2020", "01-11-2020"),
Broker = c("RealEstate", "REALestate", "Estate", "ESTATE"))
Мой список уникальных имен брокеров выглядит следующим образом:
Unique_brokers <- list("REALESTATE", "ESTATE")
Основываясь на каком-то распознавании образов, я хотел бы заменить имена брокеров в моем Data
фрейме данных уникальными именами брокеров в моем Unique_brokers
списке.
Мне частично удалось сделать это несколько вручную, используя комбинацию case_when
и str_detect
из dplyr
и stringr
соответственно.
Data <- Data %>%
mutate("UniqueBroker" = case_when(str_detect(Broker, regex("realestate", ignore_case=T))~"REALEASTE",
str_detect(Broker, regex("estate", ignore_case=T))~"ESTATE",
TRUE~"OTHER"))
Тем не менее, это довольно трудоемкий процесс с более чем 100 уникальными брокерами и более чем 12500 комбинациями написанных от руки имен брокеров в ~80.000 записях.
Мне было интересно , можно ли было бы сделать эту замену с помощью mapply
, однако до сих пор мне это не удавалось.
Заранее большое спасибо!
Редактировать
Data$Broker
состоит из всевозможных сочетаний с точки зрения правописания, включенной информации и т.д.
Напр.
Data$Broker <- c("Real-estate", "Real estate", "Real estate department 788", "Michael / REAL Estate")
Комментарии:
1. Помог ли вам какой-либо из этих ответов? Если это так, подумайте о том, чтобы проголосовать за них и принять одного из них.
Ответ №1:
Вы можете использовать i
флаг для регулярного выражения без учета регистра и использовать str_replace_all
—
library(stringr)
Unique_brokers <- c("REALESTATE", "ESTATE")
Data$Unique_brokers <- str_replace_all(Data$Broker,
setNames(Unique_brokers, str_c('(?i)', Unique_brokers)))
Ответ №2:
A dplyr
и stringr
решение:
Data %>%
mutate(Broker_unique = if_else(str_detect(Broker, "(?i)real(-|\s)?estate"),
"REALESTATE",
"ESTATE"))
Date Broker Broker_unique
1 01-10-2020 Real-estate REALESTATE
2 01-10-2020 estate ESTATE
3 01-11-2020 Real estate department 788 REALESTATE
4 01-11-2020 Michael / REAL Estate REALESTATE
Шаблон работает следующим образом:
(?i)
: сделайте совпадение нечувствительным к региструreal
: литералreal
соответствия —(-|\s)?
: совпадение-
ИЛИestate
: совпадениеestate
буквально
Данные испытаний:
Data <- data.frame(Date = c("01-10-2020", "01-10-2020", "01-11-2020", "01-11-2020"),
Broker = c("RealEstate", "REALestate", "Estate", "ESTATE"))
Data$Broker <- c("Real-estate", "estate", "Real estate department 788", "Michael / REAL Estate")