按字符串匹配从其他dataframe查找特定值
我在下面提到了两个数据帧: DF1 DF2 所需输出:按字符串匹配从其他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-
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