【问题标题】:Merge two data.frame using partially matching strings使用部分匹配的字符串合并两个 data.frame
【发布时间】:2026-01-19 01:05:01
【问题描述】:

我有以下两个data.frames

df1 <- data.frame(name = "RANDI FIRAT CAYLIOGLU", correct = 30)
df2 <- data.frame(name = "FIRAT CAYLIOGLU", id = 01)

有些人有三个名字和一个中间名,有时使用他们的名字,有时使用他们的第二名。根据我的经验,fuzzyjoin 包的regex_join 函数没有捕获这样的部分匹配。如何使用部分匹配的名称合并这两个数据集?

【问题讨论】:

    标签: r dataframe join dplyr


    【解决方案1】:

    如果它始终是导致问题的名字,您可以使用正则表达式来摆脱它。请注意,我先将所有因子转换为字符。

    df1 <- data.frame(name="RANDI FIRAT CAYLIOGLU", correct = 30, stringsAsFactors = F) 
    df2 <- data.frame(name="FIRAT CAYLIOGLU",id = 01, stringsAsFactors = F)
    
    libray(dpylr)
    df1%>%
      mutate(name2 = sub("^[A-Za-z]+ ", "", name)) %>%
      full_join(df2, by = c("name2" = "name"))
    
                       name correct           name2 id
    1 RANDI FIRAT CAYLIOGLU      30 FIRAT CAYLIOGLU  1
    

    如果它也可以是中间名,您可以创建一个额外的列 name3,其中只包含名字和姓氏:

    libray(dpylr)
        df1%>%
          mutate(name2 = sub("^[A-Za-z]+ ", "", name),
                 name3 = sub(" [A-Za-z]+ ", " ", name) %>%
          left_join(df2, by = c("name2" = "name")) %>%
          left_join(df2, by = c("name3" = "name"))
    

    这里,name2 是中间名和姓氏,name3 包含名字和姓氏。

    【讨论】:

    • 不幸的是,导致问题的并不总是名字。有些人使用他们的名字,有些人使用他们的第二名。