Использование пакета seqinr в R для подсчета оснований последовательности ДНК

#r

#r

Вопрос:

У меня есть массив, который был извлечен из файла fasta

 > dat
  [1] "t" "a" "t" "t" "t" "a" "c" "c" "g" "a" "c" "g" "a" "a" "a" "t" "t" "a" "a" "t" "a" "c" "c" "a" "t" "c" "a" "g" "g" "g" "t" "a" "t"
  [34] "t" "a" "a" "g" "a" "t" "g" "c" "t" "a" "c" "c" "a" "a" "c" "g" "t" "g" "g" "t" "a" "t" "t" "a" "a" "a" "a" "t" "g" "t" "g" "c" "c"
  [67] "c" "a" "a" "c" "c" "g" "c" "g" "a" "a" "a" "a" "a" "g" "a" "a" "a" "g" "t" "g" "g" "t" "a" "t" "a" "t" "a" "g" "g" "a" "a" "a" "a"
 

Последовательность намного длиннее, но это неважно, я хочу разбить первые 100000 символов в этом массиве на интервалы длиной 1000 и подсчитать количество оснований «g» в каждом интервале. До сих пор я пытался:

 library(seqinr)
intervals = 1000*(0:99)
g_count = count(dat[intervals 1:intervals 1000], 1)[["g"]]
 

но это возвращает ошибку: numerical expression has 100 elements: only the first used
любая помощь приветствуется

Ответ №1:

Чтобы подсчитать количество ‘g’ в каждом интервале, вы могли бы использовать этот базовый подход R. :

 n <- 1000
result <- tapply(dat, ceiling(seq_along(dat)/n), function(x) sum(x == 'g'))
 

Например, для этого вектора длиной 33 мы разделяем данные на интервал 11.

 dat <- c("t", "a", "t", "t", "t", "a", "c", "c", "g", "a", "c", "g", 
"a", "a", "a", "t", "t", "a", "a", "t", "a", "c", "c", "a", "t", 
"c", "a", "g", "g", "g", "t", "a", "t")

n <- 11
result <- tapply(dat, ceiling(seq_along(dat)/n), function(x) sum(x == 'g'))
result

#1 2 3 
#1 1 3 
 

Ответ №2:

Мы можем использовать rowsum с gl помощью base R

 rowsum( (dat == 'g'), as.integer(gl(length(dat), n, length(dat))))
 

данные

 dat <- c("t", "a", "t", "t", "t", "a", "c", "c", "g", "a", "c", "g", 
"a", "a", "a", "t", "t", "a", "a", "t", "a", "c", "c", "a", "t", 
"c", "a", "g", "g", "g", "t", "a", "t")

n <- 11