Tom*_*m A 1 string r match string-matching stringdist
对于熟悉"stringdist"软件包的人来说,这是一个问题.
我正在尝试编写一个执行以下操作的函数:
搜索很长的字符列表,例如显示的字符数量只有16个:
> stripList
[1] "AAAAAAAAAAAAAAAAAAAAAAAAAAAADAABAAADCDDAD" "BAAAABBBDACDBABAAADDCBDADBCCBDCDDCDBCDDBA"
[3] "BDDABDCCAAABABBAACADCBDADBCCBDCDDCDBCDDBA" "AADBBACDDDBABDCABAADBCADCBDDDCCC"
[5] "BBCDBBDCCBABDBCABDBBDBDDDADCDDADDDCDDCDDD" "BDDCDACABDCCBACBADCDCBDADBCCBDCDDCDDCDDBA"
[7] "BCDBADCBBDDBBBBDCBDADBCCBDCDDCDBCDDDDAAAA" "DABDDCDACABDCCBACBADC"
[9] "CABABDDCCCCACDCCDCCDADCAAAAAAAAACADADDADA" "BAABCBBBDBCDCDDADDDDCDDADBCCBDCDD"
[11] "BBDDDACDCABDDDBBACDCBDADBCCDDCDDCDDCDDBDD" "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[13] "BDDBBBBDDBDABBACDBDCBDADBCCBDCDD" "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[15] "DABDDCDACABDCCBACBADC" "BBADBACDDBABAACABCABCDCBDADBCCBDCDDCDDDDD"
Run Code Online (Sandbox Code Playgroud)
对于像这样构造的查询序列列表的每个序列的实例.
例如:
SeqName1 # queryNames
BBCDBBDCCBABDBCA # querySeqs
SeqName2 # queryNames
BBBDCCDCCCCDDDCAAACD # querySeqs
Run Code Online (Sandbox Code Playgroud)
我想查看查询序列在我的任何'stripList'中出现多少次(如果有的话)并允许1次插入,1次删除,1次替换和1次转置,并获得如下输出:
>dt
queryNames TimesFound
SeqName1 5
seqName2 145
Run Code Online (Sandbox Code Playgroud)
为此,我使用'stringdist'包的'amatch'功能,方法如下:
dt<-rapply(as.list(querySeqs), function(x) amatch(x, stripList, method = "osa", useBytes = TRUE, weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9))
dt<-data.frame(dt)
colnames(dt) <- "TimesFound"
dt<-cbind(queryNames,dt)
Run Code Online (Sandbox Code Playgroud)
我有几个问题:
在'amatch'函数中,当使用method ="osa"时,如何解释"weight"参数?举个例子,如果我使用:
method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9
Run Code Online (Sandbox Code Playgroud)
我是说我希望90%匹配我的"querySeqs"?意思是,这些分数是属于"querySeqs"还是我的表(stripList)?
"maxDist"有什么功能?(它也被解释为百分比?)
有没有办法最大化我的代码的运行时效率(通过使用data.table等)?我只是问,因为我的实际数据集是通过~1,000,000个序列列表搜索的~2000个序列查询.
是否有比'amatch'更好的方法来寻找整个序列(不仅仅是'agrep'的子串)?
如果这些是基本问题我很抱歉,关于这个问题的文件对我来说很模糊,坦白说,我还在学习.
提前致谢.
这个问题似乎已经存在了一段时间,我只是发现了它.简而言之:
(1)权重是每项行动的处罚.它允许你告诉amatch,例如删除或插入是可以的,但是你应该更多地惩罚换位.根据你的问题判断,你可以保留权重.
(2)Maxdist告诉amatch如果两个字符串超过maxDist,它们将永远不会被视为匹配.默认值为零,因此只允许完全匹配.这不是一个百分比.maxDist的相关值取决于使用的距离函数.我认为你可以使用method ='osa',maxDist = 1(允许单个转置,插入,删除或替换,但没有组合)或者如果你愿意允许最多四个编辑的组合,则可能使用maxDist = 4 .对于类似编辑的距离,距离由最大字符串中的字符数限制.有关所有支持距离的范围,请参阅R-journal纸.http://journal.r-project.org/archive/2014-1/loo.pdf
(3)我一直在优化代码.0.9版将使用多线程.我看到你正在使用rapply,你可以通过使用来避免这种情况
amatch(querySeqs,stripList,method='osa',maxDist=4)
Run Code Online (Sandbox Code Playgroud)
(4)目前,我认为amatch是R的最佳实现(但由于我是作者,我可能有偏见:)).