У меня есть список сохраненных векторов
library(seqinr) mydata <- read.fasta(file="mydata.fasta")
mydatavec <- mydata[[1]]
lst <- split(mydatavec, as.integer(gl(length(mydatavec), 100,length(mydatavec))))
df <- data.frame(matrix(unlist(lst), nrow=2057, byrow=T), stringsAsFactors=FALSE)
Теперь каждый вектор в df имеет длину 100 и состоит из букв «a», «c», «g», «t». Я хотел бы рассчитать энтропию Шеннона для каждого из этих векторов, я приведу пример того, что я имею в виду:
v1 <- count(df[1,], 1)
a c g t
27 26 24 23
v2 <- v1/sum(v1)
a c g t
0.27 0.26 0.24 0.23
v3 <- -sum(log(v2)*v2) ; print(v3)
[1]1.384293
Всего мне нужно 2057 напечатанных значений, потому что это то, сколько у меня векторов. Мой вопрос здесь, возможно ли создать цикл for или повторный цикл, который бы сделал эту операцию для меня? Я попробовал себя, но я не получил нигде с этим.
dput(head(sequence))
structure(c("function (nvec) ", "unlist(lapply(nvec, seq_len))"
), .Dim = c(2L, 1L), .Dimnames = list(c("1", "2"), ""), class = "noquote")
Моя попытка: я хотел сосредоточиться только на функции подсчета и создал это
A <- matrix(0, 2, 4)
for (i in 1:2) {
A[i] <- count(df[i,], 1)
}
Функция выполняет правильные вычисления числа «а» в первом векторе и затем следует за вторым. Он полностью игнорирует остальные буквы
A
[,1] [,2] [,3] [,4]
[1,] 27 0 0 0
[2,] 28 0 0 0
Кроме того, я наивно думал, что добавление связки «я» повсюду заставит его работать
s <- matrix(0, 1, 4)
s1 <- matrix(0, 1, 4)
s2 <- numeric(4)
for (i in 1:2) {
s[i] <- count(df[i,],1)
s1[i] <- s[i]/sum(s[i])
s2[i] <- -sum(log(s1[i])*s1[i])
}
Но меня это тоже никуда не привело.