【问题标题】:lookup specific value from other dataframe by string match通过字符串匹配从其他数据帧中查找特定值
【发布时间】:2018-05-01 18:25:20
【问题描述】:

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

DF1

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

DF2

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

所需输出:

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

我想将 Value 列中 DF1 的字符与 DF2 Value 列的字符进行匹配,并得出Type

尝试使用 phonics 库,但尚未完成,这里需要一些建议。

【问题讨论】:

  • 您似乎不需要完全匹配。对吗?
  • @MikeH。我的首选是完全匹配,但如果有任何特殊字符,则匹配最合适的匹配字符。

标签: r dataframe dplyr tidyr


【解决方案1】:

您可以使用adist 函数获取df1$Valuedf2$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

【讨论】:

  • @Roy1245,当您尝试将list 传递给[ 时,会出现该错误。你检查apply的结果了吗?
【解决方案2】:

可以在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")

【讨论】:

    【解决方案3】:

    模糊匹配可能会起作用。

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

    【讨论】:

      【解决方案4】:

      如果有很多列要合并在一起,你可以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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        • 2019-03-16
        • 2021-08-12
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多