2015-11-24 87 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类对象(一种列表)转换为您想要的简单向量。