我有以下数据:
rand.sum <- function(n){
x <- sort(runif(n-1))
c(x,1) - c(0,x)
}
M <- t(replicate(8,rand.sum(8))) # data frame with probabilities
Test1 <- as.data.frame(t(replicate(1, rand.sum(8))))
Test2 <- as.data.frame(t(replicate(1, rand.sum(8))))
Test <- rbind(Test1,Test2) # Test data
ID1 <- c("ID1")
ID2 <- c("ID2")
ID <- rbind(ID1,ID2) #ID's
data <- cbind(ID,Test)
现在我编写了以下for循环来创建一个带矩阵的列表:
for(i in 1:dim(Test)[1]) {
z <- i
gemeindeschluessel <- paste(data[z,1])
gemeinden[[gemeindeschluessel]] <- as.data.frame(matrix(nrow=1,ncol=8))
}
这个工作正常。现在,我想使用以下嵌套for循环将数据添加到列表中的数据框:
for (j in length(gemeinden)){
y <- j
for (i in dim(gemeinden[[y]])[2]){
gemeinden[[y]] [,i]=round(data[y,2]*M[1,i]+data[y,3]*M[2,i]+data[y,4]*M[3,i]
+data[y,5]*M[4,i]+data[y,6]*M[5,i]+data[y,7]*M[6,i]
+data[y,8]*M[7,i]+data[y,9]*M[8,i])}
}
但是,这个没有做任何事情,列表中的数据框仍然充满了NA。我无法弄清楚为什么这不起作用。
如何让这个嵌套for循环运行?
答案 0 :(得分:1)
正如@Gregor指出的那样,你没有初始化循环的序列,可以考虑将for
循环组合成嵌套的apply
循环。请注意,仍会使用相同的as.data.frame
和matrix
来电。
此方法的优势在于您可以直接将列表分配到lapply
输出,并避免在边距上对向量化+
添加多个sum()
元素:
gemeinden_new <- lapply(1:dim(Test)[1], function(z)
as.data.frame(
matrix(sapply(1:8, function(i) sum(data[z,2:9] * M[,i])),
nrow=1, ncol=8)
))
# NAME LIST ELEMENTS
gemeinden_new <- setNames(gemeinden_new, data$ID)
gemeinden_new
# $ID1
# V1 V2 V3 V4 V5 V6 V7 V8
# 1 0.0598796 0.1526457 0.08604147 0.2314867 0.06307882 0.2047462 0.07962943 0.122492
# $ID2
# V1 V2 V3 V4 V5 V6 V7 V8
# 1 0.1385492 0.1047066 0.06278719 0.1710685 0.09209054 0.2519348 0.06434532 0.1145178
all.equal(gemeinden, gemeinden_new)
# [1] TRUE