Создание цикла for для фрейма данных - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть список сохраненных векторов

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])
}

Но меня это тоже никуда не привело.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Будет ли это работать для вас:

df <- data.frame (x = c("a","c","g","g","g"), 
                  y = c("g","c","a","a","g"), 
                  z = c("g","t","t","a","g"),stringsAsFactors=FALSE)


A <- sapply(1:nrow(df), FUN=function(i){count(df[i,],1)})

> A
  [,1] [,2] [,3] [,4] [,5]
a    1    0    1    2    0
c    0    2    0    0    0
g    2    0    1    1    3
t    0    1    1    0    0
0 голосов
/ 01 мая 2018

Если вам не нужно сохранять счет и вам нужно только распечатать или сохранить показанный вами расчет, это должно сработать:

for(i in 1:dim(df)[1]{
    v1 <- count(df[i,], 1) 
    v2 <- v1/sum(v1) 
    v3 <- sum(log(v2)*v2)
    print(-v3) #for print
    entropy[i] <- v3 #for save the value in a vector, first create this vector

}

Проблема с циклом, который вы показываете, может заключаться в том, что вывод счетчика - это класс таблицы с 1 строкой и 4 столбцами, и вы присваиваете это строке матрицы. Также другой возможной проблемой может быть то, что в задании, например, вы объявляете s [i] <- count (df [i,], 1), когда должно быть s [i,] <- count (df [i,], 1 ). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...