我有一个向量列表
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”组成。我想计算每个向量的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)
}这个函数所做的是正确地计算第一个向量中"a“的数目,然后跟随到第二个向量。它完全忽略了其余的字母
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])
}但这也让我无处可寻。
发布于 2018-04-30 21:35:17
如果您不需要保存计数,并且只需要打印或保存所显示的计算,则这些操作应该有效:
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列,并将其分配给矩阵行。另一个可能的问题是,在赋值中-例如,您声明si <- count(dfi,1),何时应该是si,<- count(dfi,1)。
https://stackoverflow.com/questions/50107971
复制相似问题