#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