lapply和rbind没有正确附加结果

时间:2013-06-01 17:58:40

标签: arrays r loops lapply rbind

 SimNo <- 10

 for (i in 1:SimNo){
  z1<-rnorm(1000,0,1)
  z2<-rnorm(1000,0,1)
  z3<-rnorm(1000,0,1)
  z4<-rnorm(1000,0,1)
  z5<-rnorm(1000,0,1)
  z6<-rnorm(1000,0,1)

  X<-cbind(z1,z2,z3,z4,z5,z6)
  sx<-scale(X)/sqrt(999)
  det1<-det(t(sx)%*%sx)
  detans<-do.call(rbind,lapply(1:SimNo, function(x) ifelse(det1<1,det1,0)))
 }

当我使用in循环运行所有命令时,除了最后一个,我得到不同的行列式值但是当我一次运行带循环的代码时,我得到重复的所有行列式的值。

请帮助和指导控制这样的所有情况。

是否有方法可以为此代码提供简短有效的方法,以便也可以访问每个单独的变量。

2 个答案:

答案 0 :(得分:2)

每当您多次重复相同的操作且没有输入时,请考虑使用replicate。在这里你可以使用它两次:

SimNo <- 10

det1 <- replicate(SimNo, { 
   X  <- replicate(6, rnorm(1000, 0, 1))
   sx <- scale(X) / sqrt(999)
   det(t(sx) %*% sx)
})

detans <- ifelse(det1 < 1, det1, 0)

否则,这就是您的代码应该使用for循环查看的内容。您需要在每次循环迭代时创建一个用于存储输出的向量:

SimNo <- 10
detans <- numeric(SimNo)
for (i in 1:SimNo) {
  z1<-rnorm(1000,0,1)
  z2<-rnorm(1000,0,1)
  z3<-rnorm(1000,0,1)
  z4<-rnorm(1000,0,1)
  z5<-rnorm(1000,0,1)
  z6<-rnorm(1000,0,1)

  X<-cbind(z1,z2,z3,z4,z5,z6)
  sx<-scale(X)/sqrt(999)
  det1<-det(t(sx)%*%sx)
  detans[i] <- ifelse(det1<1,det1,0)
}

修改:您在评论中询问了如何使用X访问replicate。您必须使replicate创建并将所有X矩阵存储在列表中。然后使用*apply函数族遍历该列表以完成计算:

X <- replicate(SimNo, replicate(6, rnorm(1000, 0, 1)), simplify = FALSE)

det1 <- sapply(X, function(x) {
  sx <- scale(x) / sqrt(999)
  det(t(sx) %*% sx)
})

detans <- ifelse(det1 < 1, det1, 0)

此处,X现在是一个矩阵列表,因此您可以获得例如通过X[[2]]进行第二次模拟的矩阵。

答案 1 :(得分:0)

SimNo <- 10
matdet <- matrix(data=NA, nrow=SimNo, ncol=1, byrow=TRUE)

for (i in 1:SimNo){
  z1<-rnorm(1000,0,1)
  z2<-rnorm(1000,0,1)
  z3<-rnorm(1000,0,1)
  z4<-rnorm(1000,0,1)
  z5<-rnorm(1000,0,1)
  z6<-rnorm(1000,0,1)

  X<-cbind(z1,z2,z3,z4,z5,z6)
  sx<-scale(X)/sqrt(999)
  det1<-det(t(sx)%*%sx)

 matdet[i] <-do.call(rbind,lapply(1:SimNo, function(x) ifelse(det1<1,det1,0)))
}
matdet