在R而不是for循环中生成数据的更好方法是什么?

问题描述

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

我当前的代码使用一个for循环,并且可以正常工作(N = 250个id,超过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,exp(log(0.10)+ (log(1.15)*sim$z1)))
                   
  sim$y=  rbinom(obs1,exp(log(0.025)+(log(2)*sim$x1) + (log(1.2)*sim$z1)) )
}

解决方法

在R中加快仿真的主要过程与R中任何代码的矢量化相似。基本上,只要有可能,就使用内部函数而不是SQL Error [21000]: ERROR: more than one row returned by a subquery used as an expression。有时可以推导数学关系,并且可以从管道中删除多个调用。在这种情况下,只需删除for循环,然后在3次对for-loops的调用中执行所有模拟,即可大大提高速度。

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,exp(log(.1) + log(1.15) * df$z1)) df$y <- rbinom(nsim,exp(log(.025) + log(2) * df$z1+ log(1.2) * df$x1)) 将比rep快得多。 replicate仅复制您的数据集,而rep复制您放置的呼叫。例如。 replicate大致等于rep(rbinom(1e6),10),而x <- rbinom(1e6); unlist(lapply(1:6,function(z)x))大致等效于replicate(10,rbinom(1e6))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...