从字符串序列中查找重复的子字符串

时间:2014-11-11 13:53:26

标签: r

我有很多字符串序列。从每个序列我必须找到重复至少一些最小阈值时间(th)的所有这样的子串。

例如,如果其中一个字符串序列是" aboaboaboaboaboabcabcabcabcab"。如果最小重复阈值(th = 4)则特定序列的子串是" abo"," boa"," oab"," abc&#34 ;," BCA""驾驶室&#34 ;.

我用蛮力解决了它。但是如果我们在至少100000个这样的序列上应用该方法,那么在R中需要几分钟。我想在几秒钟内找到100000序列中的所有这样的子字符串。

我想在R中实现它。

2 个答案:

答案 0 :(得分:0)

您可以使用combn,但据我所知,它并不尊重订单,因此提供的组合远远多于订单所遵循的组合,例如,

s <- "aboaboaboaboaboabcabcabcabcab"
combos <- combn(strsplit(s, "")[[1]], 3, paste0, collapse="")
combos[1:5]
[1] "abo" "aba" "abb" "abo" "aba"

答案 1 :(得分:0)

这似乎有用(假设你想要3个字母的子串)。

str <- "aboaboaboaboaboabcabcabcabcab"
th  <- 4

sub <- sapply(1:(nchar(str)-2),function(i)substr(str,i,i+2))
sub[which(table(sub)>=th)]
# [1] "abo" "boa" "oab" "abo" "boa" "oab"

使用长度为100,000的字符串进行基准测试。

get.repeats <- function(str,n,k){
  sub <- sapply(1:(nchar(str)-n+1),function(i)substr(str,i,i+n-1))
  sub[which(table(sub)>=k)]
}
# benchmark
set.seed(1)
str <- paste(sample(c("A","C","G","T"),1e5,replace=TRUE),collapse="")
library(microbenchmark)
microbenchmark(get.repeats(str,3,4),times=10)
# Unit: seconds
#                    expr      min      lq   median       uq      max neval
#  get.repeats(str, 3, 4) 1.835401 1.86695 1.886206 1.917245 2.035076    10

所以这会在大约2秒内完成。