【问题标题】:Merging two data frames with non-identical rows in R在R中合并两个具有不同行的数据帧
【发布时间】:2021-08-01 03:55:13
【问题描述】:

我有两个 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 可用 heredf2 here

【问题讨论】:

    标签: r merge


    【解决方案1】:

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

    1. df1df2 中创建一个新列DISTRICT_NAMES_1,用 将所有非字母字符替换为正则表达式"[^[:alnum:]]",以便以后识别每一行。
    2. 然后你可以执行left_join
    3. 现在您将df1 中的所有数据与df2 合并,其中出现了新列DISTRICT_NAMES_1 的匹配项,如果没有匹配项,则获得NA。
    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
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用 stringdist 连接根据您的数据和偏好调整 max_dist 参数。

      fuzzyjoin::stringdist_left_join(df1, df2, by = 'DISTRICT_NAMES', max_dist = 4)
      
      #         DISTRICT_NAMES.x UBIGEO     DISTRICT_NAMES.y   POP
      #1                 HUANUCO  10101              HUÁNUCO 32589
      #2    SAN MARTIN DE PORRES  10102 SAN-MARTIN-DE-PORRES   262
      #3                   ANCON  10103                ANCÓN  1136
      #4                   RIMAC  10104                RÍMAC   642
      #5             JESUS MARIA  10105          JESÚS-MARÍA   585
      #6 VILLA MARIA DEL TRIUNFO     NA                 <NA>    NA
      

      【讨论】:

      • 我试过了,但对我的数据不起作用。我已经编辑了问题,为两个数据框添加了下载链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多