【问题标题】:Bind data frames row wise in a for loop in R在 R 的 for 循环中逐行绑定数据帧
【发布时间】:2020-07-13 16:34:05
【问题描述】:

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

代码是:

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)

【问题讨论】:

  • 所以在循环的第一次迭代中,j0。您正在尝试将循环基于序列 seq(0, 1, 0.125) 而不是整数序列,因此您不能在 j 上设置子集。

标签: r for-loop lapply do.call


【解决方案1】:

有一种简单得多的方法可以做到这一点。首先,您可能并不真正想要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 &lt;- cbind(ijval, DF)

【讨论】:

    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多