我在下面提到了两个数据帧:
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
。
试图使用拼音图书馆,但还没有完成,这里需要一些建议。
答案 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