2015-11-24 4 views
1

Мне интересно найти ngrams строки x= "A T G C C G C G T". Я использую пакет ngramR, чтобы получить ngrams. Я использую следующие строки, чтобы выполнить свою работу.nграммы не в правильном порядке

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

Что делать, если я хочу иметь комбинацию из трех или 4 или более в то время, как «ATG, TGC, GCC, CCG, CGC, GCG, CGT' или« ATGC, TGCC, GCCG, CCGC, CGCG, GCGT' –

3

Мы можем scan строку «х», чтобы получить отдельные символы, а затем 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" 

Здесь я преобразовал объект класса tokenizedText (тип списка), возвращенный с tokenize(), в простой вектор, который вы хотите.