给定在不同列中满足条件的情况下,如何根据列中最接近的匹配字符串返回值?

问题描述

我有一个包含文本字符串“样本”列的数据集。另一列包含数字概率值,最后一列包含可用性的数字度量。

demodata<-data.frame(Samples=c("NA_NA_NA","NA_NA_12","F_C_12","F_C_NA","NA_NA_12"),Amt=c(1,2,3,4,5),Useable=c(2,7,1,1))

我想根据最接近的匹配字符串创建一个新列“Revised_amt”满足“可用”的阈值。

我一直在研究用于测量 Levenshtein 距离的 RecordLinkage 包。

到目前为止,在给定“可用”阈值的情况下,我能够将 Levenshtein 相似度返回到最接近的字符串,如下所示:

demodata2<-demodata%>%
           mutate(Dist=levenshteinSim(Samples,Samples[Useable>2]))

在下面的结果数据框中,可以看到 Dist 列反映了 Levenshtein 与 Samples 列中最近匹配字符串的相似度,其中 Useable 中的值大于 2。

enter image description here

然而,我的目标是添加一列 Closest_Amt,其中 Amt 中的值取自与 Samples 列中的值最匹配的字符串,给定可用性阈值。 (在关系紧密的情况下,理想情况下,我想取连接字符串的 Amt 值的平均值)

以下是所需的结果,以及为什么 Closest_Amt 值是该行所需的值的逐行理由:

enter image description here

  • 对于第 1 行 - Useable 大于 2 的最接近的字符串是“NA_NA_12”,而该记录的 Amt 是 2。
  • 对于第 2 行 - Useable 分数大于 2,因此 Closest_Amt 记录的 Amt
  • 对于第 3 行 - 适用与第 2 行相同的逻辑。
  • 对于第 4 行 - Useable 大于 2 的最接近的字符串是“F_C_12”,因此采用与该记录关联的 Amt 值。
  • 对于第 5 行 - Useable 大于 2 的最接近的字符串是相同的“NA_NA_12”,因此 Amt 值取自第 2 行。

到目前为止的失败:

我已经在此处寻找最接近的匹配项:agrep: only return best match(es)

作为初步步骤,我的想法是首先使用从@Ramnath 的答案中复制的 ClosestMatch2 函数计算最接近的匹配(为了方便粘贴在这里):

library(RecordLinkage)

ClosestMatch2 = function(string,stringVector){

  distance = levenshteinSim(string,stringVector);
  stringVector[distance == max(distance)]

}

以下无法返回匹配项。

failed_attempt<-demodata%>%
  mutate(Closest=ClosestMatch2(Samples,Samples[Useable>2]))

跳过 ClosestMatch2 函数并希望我可以返回与最大相似度相关的 Amt,其中 Useable 大于 2,我想出了第二个失败:

fail_two<-demodata%>%mutate(Closest_amt=Amt[levenshteinSim(Samples,Samples)==max(levenshteinSim(Samples,Samples[Useable>2]))])

最后一次失败似乎只是从 Amt 列返回值。在两次失败中,我都没有提到在相似性相同的情况下需要取相关 Amt 值的平均值,但我觉得我已经离目标太远了。

任何帮助将不胜感激。此外,任何将此问题的标题改写的建议都会有所帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)