在R中使用'stringdist'和'amatch'进行字符串匹配

问题描述 投票:1回答:1

对于熟悉“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)

我有几个问题:

  1. 在'amatch'函数中,当使用method =“osa”时,如何解释“weight”参数?举个例子,如果我使用: method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9 我是说我希望90%匹配我的“querySeqs”?意思是,这些分数是属于“querySeqs”还是我的表(stripList)?
  2. “maxDist”有什么功能? (它也被解释为百分比?)
  3. 有没有办法最大化我的代码的运行时效率(通过使用data.table等)?我只是问,因为我的实际数据集是通过~1,000,000个序列列表搜索的~2000个序列查询。
  4. 是否有比“匹配”更好的方法来查找整个序列(不仅仅是像'grep'那样的子串)?

如果这些是基本问题我很抱歉,关于这个问题的文件对我来说很模糊,坦白说,我还在学习。

提前致谢。

r string match string-matching stringdist
1个回答
5
投票

这个问题似乎已经存在了一段时间,我只是发现了它。简而言之:

(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的最佳实现(但由于我是作者,我可能有偏见:))。

© www.soinside.com 2019 - 2024. All rights reserved.