【发布时间】:2010-10-01 04:06:30
【问题描述】:
我知道 R 使用向量最有效,应该避免循环。我很难自学以这种方式实际编写代码。我想要一些关于如何“矢量化”我的代码的想法。下面是为状态 (st)、plan1 (p1) 和 plan2 (p2) 的 10,000 个非唯一组合创建 10 年样本数据的示例:
st<-NULL
p1<-NULL
p2<-NULL
year<-NULL
i<-0
starttime <- Sys.time()
while (i<10000) {
for (years in seq(1991,2000)) {
st<-c(st,sample(c(12,17,24),1,prob=c(20,30,50)))
p1<-c(p1,sample(c(12,17,24),1,prob=c(20,30,50)))
p2<-c(p2,sample(c(12,17,24),1,prob=c(20,30,50)))
year <-c(year,years)
}
i<-i+1
}
Sys.time() - starttime
这需要大约 8 分钟才能在我的笔记本电脑上运行。正如预期的那样,我最终得到了 4 个向量,每个向量都有 100,000 个值。如何使用矢量函数更快地做到这一点?
附带说明,如果我将上面的代码限制为 i 上的 1000 个循环,它只需要 2 秒,但 10,000 个需要 8 分钟。知道为什么吗?
【问题讨论】:
-
嘿,JD,我今晚看到了这篇较旧的帖子。请注意:如果您的
c()电话不会更改,请将它们放在循环上方。每个循环不必要地调用c()6 次,结果是对c()的函数调用多了600,000 次,那么你需要:-) -
你能相信这是在我决定真正开始使用 R 进行实际工作的最初几个月内吗?我之前做过一些简单的回归等,但我决定将随机建模例程转移到 R。回顾我的问题记录的学习过程既令人尴尬又令人鼓舞;)就像 Virginia Slim 一样,我已经走得很远,宝贝。
-
嘿,相信我,这没什么。很久以前我在列表中发布了一些令人尴尬的问题。很多,很多更尴尬。