ngrams的顺序不正确

时间:2015-11-24 06:32:30

标签: r string n-gram

我有兴趣找到字符串ngrams的{​​{1}}。我使用x= "A T G C C G C G T" 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"的位置。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我们可以scan字符串&#39; x&#39;获取单个字符,然后将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"

答案 2 :(得分: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类对象(一种列表类型)转换为您想要的简单向量。