通过字符串匹配从其他数据框中查找特定值

时间:2018-05-01 18:25:20

标签: r dataframe dplyr tidyr

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

DF1

Lock

DF2

ID     Value
AL-1   Adf "& ert
AL-2   new '? rti
AL-3   oll- drt/
AL-4   plr -rte-

必需输出:

Value        Type           
Adf & ert    AA
new  rti     AA
oll-drt&     AB
plr-rte      AC

我希望将Value列中DF1的字符与DF2 Value列的字符匹配,并派生ID Value Type AL-1 Adf "& ert AA AL-2 new '? rti AA AL-3 oll- drt/ AB AL-4 plr -rte- AC

试图使用拼音图书馆,但还没有完成,这里需要一些建议。

4 个答案:

答案 0 :(得分:4)

您可以使用adist功能获取近似距离" df1$Value中每个值与df2$Value的字符串之间的字符串。然后你可以拿一个距离最小的那个(所以确切的匹配将被优先考虑):

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

答案 1 :(得分:1)

您可以使用R

中的合并功能
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")

答案 2 :(得分:0)

模糊匹配可能有用。

library(fuzzyjoin)

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

答案 3 :(得分:0)

如果有许多列要合并在一起,您可以绑定两个数据框:

   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