1

我试图在其他帖子中找到答案,但似乎没有任何效果。

我有一个数据集,人们使用免费响应格式回答他们所在的城市。因此,对于每个城市,人们以许多不同的方式进行识别。例如,住在亚特兰大的人可能写过“Atlanta”、“atlanta”、“Atlanta, GA”等。

该数据集中有 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")
4

2 回答 2

1

如果我们需要传递要替换的元素向量,paste则将它们与|as 模式一起并替换为 '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" 
于 2020-02-10T00:09:55.987 回答
0

关于数据清洗的问题很难回答,因为答案很大程度上取决于数据。提出的解决方案可能适用于(小)样本数据集,但可能不适用于(大)生产数据集。

在这种情况下,我看到了两种可能的方法:

  • 收集编写城市名称的所有可能方式,并用所需的城市名称替换这些不同的变体。这可以通过加入str_replace()或加入来实现。这是安全但乏味的。
  • 城市名称中查找匹配的字符串,如果找到则替换。

下面是一个蓝图,可以扩展到其他用例。为了演示,创建了一个包含一列的 data.frame 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
于 2020-02-10T08:29:52.427 回答