如何检查数据框的字符串列是否与另一个数据框的字符串列匹配?
How to check if a string column of a data frame matches with a string column of another data frame?
我打算使用公共字符列(我们称之为名称列)执行两个数据框的左连接。理想情况下,df1 的名称列中的所有值都将与 df2 的名称列匹配。但是,我知道某些值可能不完全匹配,但由于某些拼写或标点符号错误可能会部分匹配。例如。 "John Ezekiel" 在 df1 中可以拼写为 "John Ezekial"。我想确保 df1 中名称列的每个值都与 df2 名称列中的某个值匹配。在大多数情况下,会有完全匹配,但在没有完全匹配的情况下,我还想用具有大部分匹配的 df2 的值替换 df1 的那些值。我通过重现
来说明这个问题
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进行left join时,得到如下结果:
> 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
我希望生成的数据框如下所示。如果没有完全匹配并映射到相应的 ID,则 df1 中的 "name" 值应替换为 df2 中的 "name" 值。
>df3
name id
1 John Ezekiel 3
2 Mary Elizabeth 4
3 Fabio Fognini 5
4 Gael Monfils 6
5 Lucas Pouille 8
使用 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 的名称列匹配。但是,我知道某些值可能不完全匹配,但由于某些拼写或标点符号错误可能会部分匹配。例如。 "John Ezekiel" 在 df1 中可以拼写为 "John Ezekial"。我想确保 df1 中名称列的每个值都与 df2 名称列中的某个值匹配。在大多数情况下,会有完全匹配,但在没有完全匹配的情况下,我还想用具有大部分匹配的 df2 的值替换 df1 的那些值。我通过重现
来说明这个问题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进行left join时,得到如下结果:
> 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
我希望生成的数据框如下所示。如果没有完全匹配并映射到相应的 ID,则 df1 中的 "name" 值应替换为 df2 中的 "name" 值。
>df3
name id
1 John Ezekiel 3
2 Mary Elizabeth 4
3 Fabio Fognini 5
4 Gael Monfils 6
5 Lucas Pouille 8
使用 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