在 R 中的 for 循环中按行绑定数据帧

Bind data frames row wise in a for loop in R

我想执行蒙特卡洛模拟,均值 (i) 从 5 到 60 以 5 的间隔变化,j 从 0 到 1 以 0.125 的间隔变化。作为以下代码的输出,我希望为每个 j 获得的数据框沿行绑定。例如,如果我想对给定的 j 执行 10,000 次模拟,则生成的数据框(即 DF1)将具有 12 列和 10000 行,其中 12 表示 i 的长度(即 60/50。随后,DF1 为每个 j应该按行绑定。因此,对于最终数据框 j 的 8 个值,DF2 将具有 80000 行和 12 列。但是,在 运行 这段代码上,我收到此错误消息:“数据列表 [[j] 中的错误] <- DF1 : 尝试 select 小于 integerOneIndex 中的一个元素

密码是:

datalist = list()
for (j in seq(0, 1, 0.125)){
  DF1 <- do.call(cbind, lapply(seq(5,60,5), function(i) setNames(data.frame(rlnorm(n=10000, log(i^2 / sqrt((i*j)^2 + i^2)), sqrt(log(1 + ((i*j)^2 / i^2))))), i)))
  datalist[[j]] <- DF1
}
DF2 = do.call(rbind, datalist)

有一种简单得多的方法可以做到这一点。首先,您可能真的不想要 j=0,因为这会使标准偏差为零并且所有值都是恒定的,但我会保留您设置的参数:

ivals <- seq(5, 60, 5)
jvals <- seq(0, 1, 0.125)
n <- 10                      # Just 10 values for testing
ijval <- expand.grid(ival=ivals, jval=jvals)  # 108 combinations of i and j
draw <- function(i, j, n) {rlnorm(n, log(i^2 / sqrt((i*j)^2 + i^2)), sqrt(log(1 + ((i*j)^2 / i^2))))}
DF <- t(mapply(draw, i=ijval$ival, j=ijval$jval, n=n))   # 108 rows by n columns

请注意,如果您希望列指示每一行的 i 和 j 值,则可以 DF2 <- cbind(ijval, DF)