ngrams 顺序不正确

ngrams not in correct order

我有兴趣找到字符串 x= "A T G C C G C G T"ngrams 。我使用 ngram R 包来获取 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 的位置。

不知道 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

我们可以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"

文本分析包 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 class 对象(一种列表)转换为您想要的简单向量。