【问题标题】:What is the better way to generate data in R instead of a for-loop?在 R 中生成数据而不是 for 循环的更好方法是什么?
【发布时间】:2020-08-24 19:22:59
【问题描述】:

我是一个全新的 R 用户,试图将大量具有指定依赖关联的数据生成到单个 data.frame 中。

我当前的代码使用 for 循环并且工作正常(N=250 ids,超过 10 次复制),但我必须将其扩展为更大的 N 和更大的 K 复制。我曾尝试使用 foreach 和函数进行并行处理,但没有取得多大成功。我无法将复制的数据添加到最终帧。

任何帮助或指导将不胜感激。

当前代码:

set.seed(0)

Kreps <- 10  

id= as.numeric(1:250)

sim=do.call("rbind", replicate(Kreps,data.frame(id), simplify=FALSE))

sim$Krep_num = as.numeric(gl(Kreps,250))
obs1<-nrow(sim)

for(m in 1:Kreps  ){ 
  sim$z1= rbinom(obs1, 1, 0.35)

  sim$x1= rbinom(obs1, 1,exp(log(0.10)+ (log(1.15)*sim$z1)))
                   
  sim$y=  rbinom(obs1, 1,exp(log(0.025)+(log(2)*sim$x1) + (log(1.2)*sim$z1)) )
}

【问题讨论】:

    标签: r for-loop simulation parallel.foreach


    【解决方案1】:

    在 R 中加速模拟的主要方面类似于 R 中任何一段代码的矢量化。基本上尽可能使用内部函数而不是 for-loops。有时可以导出数学关系,并且可以从管道中删除多个调用。在这种情况下,只需删除 for 循环,并在 3 次调用 rbinom 中执行所有模拟,就会大大加快速度。

    set.seed(0)
    Kreps <- 10  
    id = 1:250
    obs1 <- Kreps * length(id)
    nsim <- obs1 * Kreps
    df <- data.frame(id = rep(id, kreps))
    df$z1 <- rbinom(nsim, 1, 0.35)
    df$x1 <- rbinom(nsim, 1, exp(log(.1) + log(1.15) * df$z1))
    df$y <- rbinom(nsim, 1, exp(log(.025) + log(2) * df$z1+ log(1.2) * df$x1))
    

    此外,当您想要复制数据时,rep 将比replicate 快得多。 rep 只是复制您的数据集,而 replicate 复制您放置的 调用。例如。 rep(rbinom(1e6), 10) (大致)相当于x &lt;- rbinom(1e6); unlist(lapply(1:6, function(z)x)),而replicate(10, rbinom(1e6)) 大致相当于lapply(1:6, function(x)rbinom(1e6))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2014-08-28
      • 2013-03-23
      相关资源
      最近更新 更多