根据R中的另一数据帧替换一列中的值 [英] Replace values in one column based on another dataframe in R

查看:31
本文介绍了根据R中的另一数据帧替换一列中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个超过20000个OB的数据帧。其中一列是"城市名称"(df$City)。有600多个唯一的城市名称。其中一些拼写错误。

我的数据框示例:

> df$city
[1] "BOSTN" "LOS ANGELOS" "NYC" "CHICAGOO" 
[2] "SEATTLE" "BOSTON" "NEW YORK CITY"

我创建了一个CSV文件,其中包含所有拼写错误的城市名称以及正确名称的列表。

> head(city)
           city    city_incorrect
1 BOSTON                    BOSTN
2 LOS ANGELES         LOS ANGELOS
3 NEW YORK CITY               NYC
4 CHICAGO                CHICAGOO
理想情况下,我会编写代码,根据"ciy.csv"文件替换df$City中的值。

注意:我最初发布了这个问题,有人建议我使用合并,我不认为这是解决我问题的最有效的方法,因为我还必须在我的"ciy.csv"文件中包括600个拼写正确的城市。或者,我认为我需要一个额外的步骤来组合合并数据帧中的两列。因此,我认为只替换基于"ciy.csv"的df$City中的值可能更容易。

编辑: 下面是我的数据帧的更详细信息

> df[1:5]
id   owner   city            state
1    AAAAA   BOSTN              MA
2    BBBBB   LOS ANGELOS        CA
3    CCCCC   NYC                NY
4    DDDDD   CHICAGOO           IL
5    EEEEE   BOSTON             MA
6    FFFFF   SEATTLE            WA
7    GGGGG   NEW YORK CITY      NY
8    HHHHH   LOS ANGELES        CA

如果我使用MERGE或CBIND,它不会像下面这样在我的数据帧末尾创建另一列:

> merge()
id   owner   city            state     city_correct
1    AAAAA   BOSTN              MA           BOSTON
2    BBBBB   LOS ANGELOS        CA      LOS ANGELES
3    CCCCC   NYC                NY    NEW YORK CITY
4    DDDDD   CHICAGOO           IL          CHICAGO
5    EEEEE   BOSTON             MA
6    FFFFF   SEATTLE            WA
7    GGGGG   NEW YORK CITY      NY
8    HHHHH   LOS ANGELES        CA
因此,拼写错误的城市将被更正,但拼写正确的城市将被省略。我最后想要的是一个包含所有更正的城市名称的栏。

推荐答案

在我看来,您尝试做的是匹配一个数据帧中的错误城市名称,并将其替换为另一个数据帧中的正确城市名称。如果这是正确的,则此dplyr解决方案应该有效。

数据

包含正确和错误城市名称对的数据帧:

city <- data.frame(
  city_correct = c("BOSTON", "LOS ANGELES", "NEW YORK CITY", "CHICAGO"),
  city_incorrect = c("BOSTN", "LOS ANGELOS", "NYC", "CHICAGOO"), stringsAsFactors = F)

混合使用正确和错误城市名称的数据帧:

set.seed(123)
df <- data.frame(town = sample(c("BOSTON", "LOS ANGELES", "NEW YORK CITY", "CHICAGO","BOSTN", 
                                 "LOS ANGELOS", "NYC", "CHICAGOO"), 20, replace = T), stringsAsFactors = F)

解决方案

library(dplyr)
df <- left_join(df, city, by = c("town" = "city_incorrect"))
df$town_correct<-ifelse(is.na(df$city_correct), df$town, df$city_correct)
df$city_correct <- NULL

编辑:

另一个base R解决方案是:

df$town_correct <- ifelse(df$town %in% city$city_incorrect, 
                          city$city_correct[match(df$town, city$city_incorrect)], 
                          df$town[match(df$town, city$city_correct)])

结果

df
            town  town_correct
1  NEW YORK CITY NEW YORK CITY
2            NYC NEW YORK CITY
3        CHICAGO       CHICAGO
4       CHICAGOO       CHICAGO
5       CHICAGOO       CHICAGO
6         BOSTON        BOSTON
7          BOSTN        BOSTON
8       CHICAGOO       CHICAGO
9          BOSTN        BOSTON
10       CHICAGO       CHICAGO
11      CHICAGOO       CHICAGO
12       CHICAGO       CHICAGO
13   LOS ANGELOS   LOS ANGELES
14         BOSTN        BOSTON
15        BOSTON        BOSTON
16      CHICAGOO       CHICAGO
17   LOS ANGELES   LOS ANGELES
18        BOSTON        BOSTON
19 NEW YORK CITY NEW YORK CITY
20      CHICAGOO       CHICAGO

这篇关于根据R中的另一数据帧替换一列中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆