我有兴趣找到字符串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"
的位置。
答案 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"
答案 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类对象(一种列表类型)转换为您想要的简单向量。