Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从字符串序列中查找重复的子字符串_R - Fatal编程技术网

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

R 从字符串序列中查找重复的子字符串,r,R,我有一系列的字符串。从每个序列中,我必须找到至少重复一些最小阈值时间的所有子字符串 例如,如果字符串序列中有一个是ABOABOCAB。若最小重复阈值TH=4,那个么特定序列的子串是abo、boa、oab、abc、bca、cab 我用蛮力解决了它。但是如果我们在至少100000个这样的序列上应用这个方法,那么在R中需要几分钟。我想在几秒钟内找到100000个序列中的所有这样的子字符串 我想在R中实现它。您可以使用combn,但据我所知,它不尊重顺序,因此提出了比尊重顺序更多的组合,例如 s <

我有一系列的字符串。从每个序列中,我必须找到至少重复一些最小阈值时间的所有子字符串

例如,如果字符串序列中有一个是ABOABOCAB。若最小重复阈值TH=4,那个么特定序列的子串是abo、boa、oab、abc、bca、cab

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

我想在R中实现它。

您可以使用combn,但据我所知,它不尊重顺序,因此提出了比尊重顺序更多的组合,例如

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

假设您需要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"
以及一些长度为100000的基准测试

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秒钟。

我推测子字符串的长度必须是3-这是正确的吗?否则会有许多长度为2或1的条纹。。。符合这个标准的。