按字符串匹配从其他dataframe查找特定值

按字符串匹配从其他dataframe查找特定值,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我在下面提到了两个数据帧: DF1 DF2 所需输出: ID Value Type AL-1 Adf "& ert AA AL-2 new '? rti AA AL-3 oll- drt/ AB AL-4 plr -rte- AC 我想将值列中DF1的字符与DF2值列的字符进行匹配,并导出类型 尝试使用语音库,但尚未完成,此处需要一些建议 您可以在R中使用merge函数 df1=data.frame(ID=c("AL-

我在下面提到了两个数据帧:

DF1

DF2

所需输出:

ID     Value         Type
AL-1   Adf "& ert    AA
AL-2   new '? rti    AA
AL-3   oll- drt/     AB
AL-4   plr -rte-     AC
我想将值列中DF1的字符与DF2值列的字符进行匹配,并导出
类型


尝试使用语音库,但尚未完成,此处需要一些建议

您可以在R中使用merge函数

df1=data.frame(ID=c("AL-1","AL-2","AL-3"),Value=c("Adf & ert","new '? rti","oll- drt/"))
df2=data.frame(Value=c("Adf & ert","new '? rti","oll- drt/"),Type=c("AA","AA","AB"))

df=merge(df1,df2,by = "Value")

您可以使用
adist
函数获得
df1$Value
中每个值的字符串之间的近似“距离”,与
df2$Value
相比。然后,您可以选择距离最小的一个(因此将优先考虑精确匹配):

库(utils)

df1$Type模糊匹配可能有效

library(fuzzyjoin)

library(stringr)
DF1 %>% fuzzy_left_join(DF2, by = c("Value" = "Value"), match_fun = str_detect)

如果有许多列要合并在一起,您可以cbind这两个数据帧:

   cbind(df1,df2[max.col(-adist(df1$Value,df2$Value,partial=T)),])
        ID      Value     Value Type
    1 AL-1  Adf & ert Adf & ert   AA
    2 AL-2 new '? rti  new  rti   AA
    3 AL-3  oll- drt/  oll-drt&   AB
    4 AL-4  plr -rte-   plr-rte   AC

看起来你不想要精确的匹配。“是这样吗?”米凯。我的第一个偏好是精确匹配,但如果有任何特殊字符与最合适匹配的字符不匹配。@Roy1245,当您试图将
列表
传递给
[
时,会出现该错误。您是否检查了
应用
的结果?
library(utils)
df1$Type <- df2$Type[apply(adist(df1$Value, df2$Value), 1, which.min)]

df1
#    ID      Value Type
#1 AL-1 Adf "& ert   AA
#2 AL-2 new '? rti   AA
#3 AL-3  oll- drt/   AB
#4 AL-4  plr -rte-   AC
library(fuzzyjoin)

library(stringr)
DF1 %>% fuzzy_left_join(DF2, by = c("Value" = "Value"), match_fun = str_detect)
   cbind(df1,df2[max.col(-adist(df1$Value,df2$Value,partial=T)),])
        ID      Value     Value Type
    1 AL-1  Adf & ert Adf & ert   AA
    2 AL-2 new '? rti  new  rti   AA
    3 AL-3  oll- drt/  oll-drt&   AB
    4 AL-4  plr -rte-   plr-rte   AC