首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R向量思考

用R向量思考
EN

Stack Overflow用户
提问于 2009-01-13 15:58:49
回答 2查看 2.7K关注 0票数 26

我知道R使用向量是最有效的,应该避免循环。我很难自学以这种方式实际编写代码。我想要一些关于如何‘向量化’我的代码的想法。下面是为10,000个状态(st)、plan1 (p1)和plan2 (p2)的非唯一组合创建10年样本数据的示例:

代码语言:javascript
复制
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个值。如何使用向量函数更快地完成此操作?

顺便说一句,如果我将上面的代码限制在1000个循环中,只需要2秒,但是10,000个循环需要8分钟。知道为什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-13 18:00:54

显然,在我发布我的问题之前,我应该在这个问题上再工作一个小时。回想起来,这是很明显的。:)

为了使用R的向量逻辑,我去掉了循环,并将其替换为:

代码语言:javascript
复制
st <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p1 <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p2 <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
year <- rep(1991:2000,1000)

我现在几乎可以瞬间完成100,000个样本。我知道向量更快,但是该死的。我假设100,000个循环使用一个循环会花费一个多小时,而向量法只需要不到1秒。为了好玩,我让向量变成了一百万。它花了大约2秒才完成。由于我必须测试失败,我尝试了10 my,但在我的2 2GB笔记本电脑上耗尽了内存。我切换到我的Vista64桌面,使用6 6GB的内存,在17秒内创建了长度为10 my的向量。100 in使事情分崩离析,因为其中一个向量超过763mb,导致R的分配问题。

R中的向量对我来说是惊人的快。我想这就是为什么我是一个经济学家而不是一个计算机科学家。

票数 9
EN

Stack Overflow用户

发布于 2009-01-13 22:09:25

为了回答你的问题,为什么10000的循环比你的1000循环花了更长的时间:

我认为主要的疑点是在每个循环中发生的连接。随着数据变长,R可能会将向量中的每个元素复制到一个新的向量中。复制一个小的(平均500个元素)数据集1000次是很快的。复制一个更大的(平均5,000个元素)数据集10000次会更慢。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/439526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档