对于熟悉“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"
对于像这样构造的查询序列列表的每个序列的实例。
例如:
SeqName1 # queryNames
BBCDBBDCCBABDBCA # querySeqs
SeqName2 # queryNames
BBBDCCDCCCCDDDCAAACD # querySeqs
我想查看查询序列在我的任何'stripList'中出现多少次(如果有的话)并允许1次插入,1次删除,1次替换和1次转置,并获得如下输出:
>dt
queryNames TimesFound
SeqName1 5
seqName2 145
为此,我使用'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)
我有几个问题:
method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9
我是说我希望90%匹配我的“querySeqs”?意思是,这些分数是属于“querySeqs”还是我的表(stripList)?如果这些是基本问题我很抱歉,关于这个问题的文件对我来说很模糊,坦白说,我还在学习。
提前致谢。
这个问题似乎已经存在了一段时间,我只是发现了它。简而言之:
(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)
(4)目前,我认为amatch是R的最佳实现(但由于我是作者,我可能有偏见:))。