2

对于熟悉“stringdist”包的任何人来说,这是一个问题。

我正在尝试编写一个执行以下操作的函数:

搜索很长的字符列表,例如(仅显示约 100 万个字符中的 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)

我有几个问题:

  1. 在'amatch'函数中,当使用method =“osa”时,“weight”参数如何解释?例如,如果我要使用:

    method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9
    

    我是说我想要我的“querySeqs”的 90% 匹配吗?意思是,这些分数是否与“querySeqs”或我的表(stripList)有关?

  2. “maxDist”有什么功能?(它也被解释为百分比吗?)

  3. 有没有办法最大化我上面的代码的运行时效率(可能通过使用 data.table 等)?我之所以问,是因为我的实际数据集是通过约 1,000,000 个序列列表搜索的约 2000 个序列查询。

  4. 有没有比 'amatch' 更好的方法来查找整个序列(不仅仅是像 'agrep' 那样的子串)?

如果这些是基本问题,我很抱歉,这方面的文档对我来说很模糊,坦率地说,我还在学习。

提前致谢。

4

1 回答 1

6

这个问题似乎在这里有一段时间了,我才刚刚找到它。简而言之:

(1) 权重是对每个动作的惩罚。它允许您告诉匹配项,例如删除或插入是可以的,但您认为换位应该受到更多的惩罚。从您的问题来看,您可能可以保持原样。

(2) Maxdist 告诉 amatch,如果两个字符串的距离大于 maxDist,则它们永远不会被认为是匹配的。默认值为零,因此只允许完全匹配。它不是一个百分比。maxDist 的相关值取决于使用的距离函数。我认为您可以使用 method='osa', maxDist=1 (允许单个转置,插入,删除或替换,但不能组合)或者如果您愿意允许最多四个编辑的组合,也可以使用 maxDist=4 . 对于类似编辑的距离,距离受最大字符串中的字符数限制。有关所有支持距离的范围,请参阅 R 期刊论文。http://journal.r-project.org/archive/2014-1/loo.pdf

(3) 我一直在优化代码。0.9 版将使用多线程。我看到你正在使用 rapply,你可以通过使用来避免这种情况

amatch(querySeqs,stripList,method='osa',maxDist=4)

(4) 目前,我认为 amatch 是 R 的最佳实现(但由于我是作者,我可能有偏见:))。

于 2014-10-07T15:21:00.953 回答