2013-10-10 36 views
1

所以我有一個核苷酸序列,我需要計算單詞gaga出現在序列中的次數。這是我到目前爲止有:需要統計字符串中出現字母順序的次數R

dna=c("a","g","c","t") 
N=16 
x=sample(dna,N,4) 
x2=paste(x,collapse="") 
x2 

下面是一個例子輸出:

gtaggcctaattataa 

最終,我會寫一個循環,使這個運行100次,並繪製計數的直方圖單詞「gaga」。所以,我的主要問題是:如何編寫函數或代碼來搜索字符串x2並計算單詞「gaga」的出現次數。

任何幫助,將不勝感激!謝謝!

+7

如何重疊計數?是「gagaga」1還是2?是「gagagaga」2還是3?幾乎可以肯定的是一些Bioconductor軟件包可以非常有效地完成這項工作。從'Biostrings'包中查看'matchPattern'。 –

回答

3
?regex 
sapply(gregexpr("gaga", c("gtaggcctaattataa", 
          "gtaggcctaatgagaataa", 
          "gagagaga")) , 
     function(x) if(x[1]==-1){ 0 }else{ length(x) }) 
[1] 0 1 2 
+0

OOOPS。需要檢查-1。 –

1

這實際上是對迪文的解決方案的包裝在qdap包中找到:

x<- c("gtaggcctaattataa", "gtaggcctaatgagaataa", "gagagaga") 

library(qdap) 
qdap:::termco.h(x, "gaga", seq_along(x)) 

## 3 word.count term(gaga) 
## 1 1   1   0 
## 2 2   1   1 
## 3 3   1   2 

如果你只想計數:

qdap:::termco.h(x, "gaga", 1:3)[, 3] 
+0

請注意,本和德文的方法不會像Ben指出的那樣發現重疊。 –

0

下面是計數的方法重疊太多:

vec <- c("gagatttt", 
"ttttgaga", 
"gaga", 
"tttgagattt", 
"gagagaga", 
"gagaga") 


sapply(strsplit(vec, "ga(?=ga)", perl = TRUE), length) - 1L 
# [1] 1 1 1 1 3 2 
0

使用stri_count_fixedstringi

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