微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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 举报,一经查实,本站将立刻删除。