2015-11-24 125 views
1

我有興趣找到字符串x= "A T G C C G C G T"ngrams。我使用ngramR包得到ngrams。我使用以下幾行來完成我的工作。ngrams的順序不正確

library(ngram)  
ng <- ngram(x,n=2) 
ngrams_out = get.ngrams(ng) 
ngrams_final <- gsub(" ", "",ngrams_out , fixed = TRUE) 
# "CG" "TG" "AT" "GC" "CC" "GT" ## ngrams 

這給所有無重複上述字符串的ngrams,但我很驚訝,ngrams不正確的順序。該訂單對於追蹤ngram的位置非常重要。 ngrams的正確順序是"AT","TG","GC","CC","CG","GC","CG","GT"重複,從那裏我可以清楚地確定給定字符串中特定ngram的位置。

回答

3

不知道ngram但你應該產生這樣的輸出,

x= "A T G C C G C G T" 
strsplit(gsub("(\\S)(?=\\s(\\S))|\\s+\\S$", "\\1\\2", x, perl=T), " ")[[1]] 
# [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT" 

DEMO

+0

怎麼樣'x =「ATGCCGCGT」' –

+0

'gsub(「\\ B」,「」,x,perl = T)'然後在上面應用上面的這個.. –

+0

如果我想組合三個或者像ATG,TGC,GCC,CCG,CGC,GCG,CGT或ATGC,TGCC,GCCG,CCGC,CGCG,GCGT一樣,每次4個或更多。 –

3

我們可以scan字符串「X」,以獲得單個字符,然後paste相鄰元素在一起。

v1 <- scan(text=x, what='') 
paste0(v1[-length(v1)], v1[-1]) 
#[1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT" 

爲更新的問題,

x1 <- gsub('\\s+', '', x) 
n <- 3 
pat <- paste0('.{', n,'}') 
library(stringi) 
v1 <- c(stri_list2matrix(lapply(seq_len(n), function(i) 
    stri_extract_all_regex(substring(x1,i), pat)[[1]]),byrow=TRUE)) 
v1[!is.na(v1)] 
#[1] "ATG" "TGC" "GCC" "CCG" "CGC" "GCG" "CGT" 

更改爲

n <- 4 
v1[!is.na(v1)] 
#[1] "ATGC" "TGCC" "GCCG" "CCGC" "CGCG" "GCGT" 
+1

謝謝。你的答案也適用於像'x =「字符串ATGCCGCGT」' –

+0

@AaghazHussain你可以使用'v1 < - strsplit(x,'')[[1]]'然後使用代碼。 – akrun

+0

如果我不使用這條線,是否有任何副作用? –

1

課文分析包quanteda有很大的ngram發生器:

require(quanteda) 
unlist(tokenize("A T G C C G C G T", ngrams = 2, concatenator = "")) 
## [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT" 

這裏我已經將從tokenize()返回的tokenizedText類對象(一種列表)轉換爲您想要的簡單向量。