为数据帧创建for循环

时间:2018-04-30 20:46:00

标签: r loops for-loop

我有一个存储的矢量列表

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长,由字母&#34; a&#34;,&#34; c&#34;,&#34; g&#34;,&#34; t&#组成34 ;.我想计算每个向量的Shannon熵,我将举例说明我的意思:

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

该功能的作用是正确计算&#34; a&#34;在第一个向量中,然后在第二个向量中。它完全忽略了其余的字母

A
     [,1] [,2] [,3] [,4]
[1,]   27    0    0    0
[2,]   28    0    0    0

此外,我天真地想到加入一堆&#34; i&#34;到处都会让它发挥作用

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 :(得分:2)

如果您不需要保存计数而只需要打印或保存您显示的计算,这些应该有效:

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

}

您显示的循环问题可能是count的输出是一个包含1行和4列的表类,您可以将其分配给矩阵行。另一个可能的问题可能是在分配例如你声明s [i]&lt; - count(df [i,],1),什么时候应该是s [i,]&lt; - count(df [i,] ,1)。

答案 1 :(得分:1)

这对你有用吗?

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