如何解决给定在不同列中满足条件的情况下,如何根据列中最接近的匹配字符串返回值?
我有一个包含文本字符串“样本”列的数据集。另一列包含数字概率值,最后一列包含可用性的数字度量。
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。
然而,我的目标是添加一列 Closest_Amt
,其中 Amt
中的值取自与 Samples
列中的值最匹配的字符串,给定可用性阈值。 (在关系紧密的情况下,理想情况下,我想取连接字符串的 Amt
值的平均值)
以下是所需的结果,以及为什么 Closest_Amt
值是该行所需的值的逐行理由:
- 对于第 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 举报,一经查实,本站将立刻删除。