【问题标题】:How to check if a string column of a data frame matches with a string column of another data frame?如何检查数据框的字符串列是否与另一个数据框的字符串列匹配?
【发布时间】:2019-02-19 00:05:53
【问题描述】:

我打算使用一个公共字符列(我们称之为名称列)执行两个数据帧的左连接。理想情况下,df1 的名称列中的所有值都将与 df2 的名称列匹配。但是,我了解某些值可能不完全匹配,但由于某些拼写或标点错误会部分匹配。例如。 “John Ezekiel”在 df1 中可以拼写为“John Ezekial”。我想确保 df1 中 name 列的每个值都与 df2 的 name 列中的某个值匹配。在大多数情况下,会有完全匹配,但在没有完全匹配的情况下,我也想用 df2 的值替换那些最部分匹配的值。我已经通过复制来说明这个问题

df1 <- data.frame(name=c("John Ezekial","Mary Elizabeth","Fabio Fonini","Gael Monfils","Lucas Pouile"))    
df2 <- data.frame(name=c("Aron Ramsey","John Doe","John Ezekiel","Mary Elizabeth","Fabio Fognini","Gael Monfils","Marin Cilic","Lucas Pouille","Tomas Berdych","Juan Martin Del Potro"),id=1:10)
> df1
            name
1   John Ezekial
2 Mary Elizabeth
3   Fabio Fonini
4   Gael Monfils
5   Lucas Pouile

> df2
                name     id
1            Aron Ramsey  1
2               John Doe  2
3           John Ezekiel  3
4         Mary Elizabeth  4
5          Fabio Fognini  5
6           Gael Monfils  6
7            Marin Cilic  7
8          Lucas Pouille  8
9          Tomas Berdych  9
10 Juan Martin Del Potro 10

当df1与df2进行左连接时,我得到如下结果:

> df1 %>% left_join(df2)
Joining, by = "name"
            name id
1   John Ezekial NA
2 Mary Elizabeth  4
3   Fabio Fonini NA
4   Gael Monfils  6
5   Lucas Pouile NA

我希望生成的数据框如下所示。如果没有完全匹配,则 df1 中的“name”值应替换为 df2 中的“name”值并映射到其对应的 id。

   >df3
            name id
1   John Ezekiel 3
2 Mary Elizabeth 4
3   Fabio Fognini 5
4   Gael Monfils 6
5   Lucas Pouille 8

【问题讨论】:

  • (由于明显缺乏搜索努力而投反对票)我在 [r] merge partial match 上搜索得到 33 次点击,在 [r] join partial match 上搜索得到 17 次以上

标签: r regex gsub


【解决方案1】:

使用 Base R,您可以执行以下操作:

 df2[which(adist(df1$name,df2$name)<2,T)[,2],]
                name id
    3   John Ezekiel  3
    4 Mary Elizabeth  4
    5  Fabio Fognini  5
    6   Gael Monfils  6
    8  Lucas Pouille  8

【讨论】:

  • 谢谢。那很有帮助。但是,df1 中有很多重要的列。只是为了举例,我简化为一列。基本上,我想将 df2 的id 列添加到 df1 的现有列中。因此,df1 的 name 列中未完全匹配的行应替换为与 df2 的 name 列中的值最匹配的行。
  • @MohamadSahil 您可以编辑此代码以获得您想要的。其中which(adist(df1$name,df2$name)&lt;2,T) 为您提供了 data1 和 data2 的行之间的关系
  • 谢谢。我这样做了。当我们计算具有多个单词 (3-7) 的两个字符串向量之间的距离时,adist() 会正常工作吗?
  • @MohamadSahil 不是真的。在这种情况下,您需要矢量化 agrep
猜你喜欢
  • 2018-07-10
  • 2021-11-15
  • 1970-01-01
  • 2019-11-30
  • 2021-01-16
  • 2019-05-13
  • 2023-01-29
  • 1970-01-01
  • 2021-07-16
相关资源
最近更新 更多