例如,我有一个字符串
"AAAAAAACGAAAAAACGAAADGCGEDCG"
我想计算CG
重复多少次。
我该怎么做?
答案 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函数readDNAStringSet
或readAAStringSet
答案 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