首页 > 解决方案 > 在R中合并两个具有不同行的数据框

问题描述

我有两个 df,每个来自不同的来源。它们都引用了相同的信息,但其中有一个我感兴趣的附加列。

head(df1)
  DISTRICT_NAMES               
  <chr>                  
1 HUANUCO                
2 SAN MARTIN DE PORRES   
3 ANCON                  
4 RIMAC                  
5 JESUS MARIA            
6 VILLA MARIA DEL TRIUNFO
#df1 have 1690 obs.

head(df2)
  UBIGEO DISTRICT_NAMES                 POP
   <dbl> <chr>                       <dbl>
1  10101 HUÁNUCO                     32589
2  10102 SAN-MARTIN-DE-PORRES          262
3  10103 ANCÓN                        1136
4  10104 RÍMAC                         642
5  10105 JESÚS-MARÍA                   585
6  10106 VILLA MARÍA DEL TF           1781
#df2 have 1874 obs.

如您所见,'DISTRICT_NAMES' 列在两个 df 中具有相似的值,尽管不相同。由于目前的数据框,我无法通过merge函数合并它们,这是我的最终意图。

我的查询是是否有办法告诉 R:“如果一行的值在 7 个字母中的 3 个与另一行匹配,则假设它们相同并继续合并”。

以防万一,df1在此处df2 此处获得

标签: rmerge

解决方案


这是一个可能有帮助的策略:

  1. 在其中创建一个新列DISTRICT_NAMES_1df1df2用正则表达式替换所有非字母字符,"[^[:alnum:]]"以便 稍后标识每一行。
  2. 然后你可以执行一个left_join
  3. 现在,您将所有数据与新列匹配的位置df1合并,如果没有匹配,则得到 NA。df2DISTRICT_NAMES_1
  4. 现在您可以进行进一步的数据整理。

注意我不确定这个策略是否会成功,但你可以试试!

library(dplyr)

df1_new <- df1 %>% 
    mutate(DISTRICT_NAMES_1 = str_replace_all(DISTRICT_NAMES, "[^[:alnum:]]", "")) %>% 
    arrange(DISTRICT_NAMES_1)

df2_new <- df2 %>% 
    mutate(DISTRICT_NAMES_1 = str_replace_all(DISTRICT_NAMES, "[^[:alnum:]]", "")) %>% 
    arrange(DISTRICT_NAMES_1)

df_result <- df1_new %>% 
    left_join(df2_new, by="DISTRICT_NAMES_1") 

输出:

> df_result 
# A tibble: 1,827 x 5
   DISTRICT_NAMES.x        DISTRICT_NAMES_1      UBIGEO DISTRICT_NAMES.y          POP
   <chr>                   <chr>                  <dbl> <chr>                   <dbl>
 1 ABANCAY                 ABANCAY                30101 ABANCAY                 69028
 2 ABELARDO PARDO LEZAMETA ABELARDOPARDOLEZAMETA  20502 ABELARDO PARDO LEZAMETA   244
 3 ACARI                   ACARI                     NA NA                         NA
 4 ACAS                    ACAS                   21402 ACAS                      656
 5 ACCHA                   ACCHA                  81002 ACCHA                    3028
 6 ACCOMARCA               ACCOMARCA              51102 ACCOMARCA                 886
 7 ACHAYA                  ACHAYA                210202 ACHAYA                   2826
 8 ACHOMA                  ACHOMA                 40502 ACHOMA                    841
 9 ACO                     ACO                    20902 ACO                       379
10 ACO                     ACO                   120202 ACO                      1642

推荐阅读