在R中查找序列中的重复字符

时间:2014-01-15 20:41:05

标签: regex string r

例如,我有一个字符串

"AAAAAAACGAAAAAACGAAADGCGEDCG"

我想计算CG重复多少次。 我该怎么做?

6 个答案:

答案 0 :(得分:7)

您可以使用gregexpr"CG"中查找vec的位置。我们必须检查是否没有匹配(-1)。函数sum计算匹配数。

> vec <- "AAAAAAACGAAAAAACGAAADGCGEDCG"
> sum(gregexpr("CG", vec)[[1]] != -1)
[1] 4

如果您有字符串向量,则可以使用sapply

> vec <- c("ACACACACA", "GGAGGAGGAG", "AACAACAACAAC", "GGCCCGCCGC", "TTTTGTT", "AGAGAGA")
> sapply(gregexpr("CG", vec), function(x) sum(x != -1))
[1] 0 0 0 2 0 0

如果你有一个字符串列表,你可以使用unlist(vec),然后使用上面的解决方案。

答案 1 :(得分:4)

Bioconductor包Biostrings有一个matchPattern函数

countGC <- matchPattern("GC",DNSstring_object)

请注意DNSstring_object是使用biostring函数readDNAStringSetreadAAStringSet

读取的FASTA序列

答案 2 :(得分:4)

使用str_count中的stringr。它很容易记住和阅读,但不是基本功能。

library(stringr)
str_count("AAAAAAACGAAAAAACGAAADGCGEDCG", "CG")
# [1] 4

答案 3 :(得分:2)

在基础R中,您可以使用带有循环的substring来查找CG

的出现次数
> str <- "AAAAAAACGAAAAAACGAAADGCGEDCG"
> x <- sapply(seq(nchar(str)-1), function(i) substring(str, i, i+1) == 'CG')
> sum(x)
## [1] 4

答案 4 :(得分:1)

执行字符串处理函数基准测试

可能会很有趣
## Data
require("stringi")
vec = paste0(sample(LETTERS, 1e6, replace = TRUE), collapse = "")
df <- data.frame(vec, vec, vec, vec, vec,
                 vec, vec, vec, vec, vec,
                 stringsAsFactors = FALSE)

### Base method
base_fun <- function(x){
  sapply(gregexpr("CG", x), function(x) sum(x != -1))  
}

### Stringi Method
stringi_fun <- function(x){
  sapply(x, function(x) stri_count_fixed(x,"CG"))  
}

### Stringr method
library(stringr)
stringr_fun <- function(x){
  sapply(x, function(x) str_count(x, "CG"))
}


base_fun(df)
# [1] 1441 1441 1441 1441 1441 1441 1441 1441 1441 1441

stringi_fun(df)
# vec vec.1 vec.2 vec.3 vec.4 vec.5 vec.6 vec.7 vec.8 vec.9 
# 1441  1441  1441  1441  1441  1441  1441  1441  1441  1441

stringr_fun(df)
# vec vec.1 vec.2 vec.3 vec.4 vec.5 vec.6 vec.7 vec.8 vec.9 
# 1441  1441  1441  1441  1441  1441  1441  1441  1441  1441

require(rbenchmark)
benchmark(base_fun(df), stringi_fun(df), stringr_fun(df))
# test replications elapsed relative user.self sys.self user.child sys.child
# 1    base_fun(df)          100  17.499    1.000    17.513        0          0         0
# 2 stringi_fun(df)          100  34.897    1.994    34.926        0          0         0
# 3 stringr_fun(df)          100  17.555    1.003    17.564        0          0         0

在这个特定的例子中,这是结果。随意添加或更改它们。     base_fun(df)= stringr_fun(df)&gt; stringi_fun(df)

编辑: stringi 0.2-3中的搜索引擎已经大幅改进。新的基准测试(在不同的机器上):

benchmark(base_fun(df), stringi_fun(df), stringr_fun(df))
##              test replications elapsed relative user.self sys.self user.child sys.child
## 1    base_fun(df)          100  26.412   21.214    26.353    0.004          0         0
## 2 stringi_fun(df)          100   1.245    1.000     1.241    0.000          0         0
## 3 stringr_fun(df)          100  26.995   21.683    26.905    0.011          0         0

所以我们有stringi&lt;&lt; base = stringr

答案 5 :(得分:0)

使用stringi包中的stri_count_fixed

require("stringi")

dna=c("a","g","c","t")
N=160
x=sample(dna,N,4)
x2 <- stri_paste(x,collapse="")
stri_count_fixed(x2,"gaga")
## 2