Условная замена строки в r

#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")