R найти заменить в кадре данных - PullRequest
1 голос
/ 10 февраля 2020

Я пытался найти ответ на этот вопрос в других сообщениях, но, похоже, ничего не помогало.

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

В этом наборе данных представлено 12 городов. Я пытаюсь очистить эту переменную, чтобы каждый город был написан последовательно. Есть ли способ сделать это эффективно для каждого города? Я пробовал mutate_if и str_replace_all, но не могу понять это (см. Мой код ниже)

all_data_city <- mutate_if(all_data_city, is.character, 
                str_replace_all, pattern = "Atlanta, GA",  
                replacement = "Atlanta")
all_data_city %>%
  str_replace_all(c("Atlanta, GA" & "HCA Atlanta" & "HCC Atlanta" &
                      "Suwanee" & "Suwanee, GA" & "suwanee"), = "Atlanta")

Ответы [ 2 ]

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

Если нам нужно передать вектор элементов для замены, paste их вместе с | в качестве шаблона и заменить на 'Atlanta'

library(dplyr)
library(stringr)
pat <- str_c(c("Atlanta, GA" , "HCA Atlanta" , "HCC Atlanta" ,
                  "Suwanee" , "Suwanee, GA" , "suwanee"), collapse = "|")
all_data_city %>%
         str_replace_all(pat, "Atlanta")

Используя воспроизводимый пример с iris

iris %>% 
   transmute(Species = str_replace_all(Species, 
           str_c(c("set", "versi"), collapse="|"), "hello")) %>% 
   pull(Species) %>% 
   unique
#[1] "helloosa"   "hellocolor" "virginica" 
0 голосов
/ 10 февраля 2020

Сложно ответить на вопросы по очистке данных, поскольку ответы сильно зависят от данных. Предлагаемые решения могут работать для (малого) выборочного набора данных, но могут не работать для (большого) производственного набора данных.

В этом случае я вижу два возможных подхода:

  • Сбор всех возможных способы написания названия города и замены этих вариантов на желаемое название города. Это может быть достигнуто путем str_replace() или присоединением . Это безопасно, но утомительно.
  • Поиск подходящей символьной строки в названии города и замена, если она найдена.

Ниже приведена синяя печать, которая может быть расширена для других случаев использования. Для демонстрации создается фрейм данных с одним столбцом city:

library(dplyr)
library(stringr)
data.frame(city = c("Atlanta, GA", "HCA Atlanta", "HCC Atlanta",
                    "Suwanee", "Suwanee, GA", "suwanee", "Atlantic City")) %>% 
  mutate(city_new = case_when(
    str_detect(city, regex("Atlanta|Suwanee", ignore_case = TRUE)) ~ "Atlanta",
    TRUE ~ as.character(city)
  )
)
           city      city_new
1   Atlanta, GA       Atlanta
2   HCA Atlanta       Atlanta
3   HCC Atlanta       Atlanta
4       Suwanee       Atlanta
5   Suwanee, GA       Atlanta
6       suwanee       Atlanta
7 Atlantic City Atlantic City
...