嵌套for循环以编辑包含数据框的列表中的数据

时间:2018-05-01 13:47:12

标签: r list for-loop dataframe nested

我有以下数据:

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循环运行?

1 个答案:

答案 0 :(得分:1)

正如@Gregor指出的那样,你没有初始化循环的序列,可以考虑将for循环组合成嵌套的apply循环。请注意,仍会使用相同的as.data.framematrix来电。

此方法的优势在于您可以直接将列表分配到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