当前位置:  开发笔记 > 编程语言 > 正文

用R来思考向量

如何解决《用R来思考向量》经验,为你挑选了2个好方法。

我知道R可以最有效地使用向量,并且应该避免循环.我很难教自己用这种方式编写代码.我想了解如何"矢量化"我的代码.下面是为10,000个非唯一的state(st),plan1(p1)和plan2(p2)组合创建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个值,正如预期的那样.如何使用矢量函数更快地完成此操作?

作为旁注,如果我将上面的代码限制为1000循环,它只需要2秒,但10,000需要8分钟.知道为什么吗?



1> JD Long..:

显然,在我发布问题之前,我应该再研究一下这个问题.回想起来,这是显而易见的.:)

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

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个样本.我知道矢量更快,但是dang.我假设100,000个循环使用一个循环需要花费一个多小时,矢量方法需要<1秒.只是为了踢,我让矢量一百万.完成需要大约2秒钟.因为我必须测试失败,我尝试了10毫米,但在我的2GB笔记本电脑上耗尽了内存.我用6GB内存切换到我的Vista 64桌面,并在17秒内创建了长度为10mm的向量.由于其中一个向量超过763mb而导致分配问题,因此100mm制造的东西分崩离析.

R中的向量对我来说非常快.我猜这就是为什么我是经济学家,而不是计算机科学家.



2> David Locke..:

要回答你的问题,为什么10000的循环花费的时间比你的1000循环长得多:

我认为主要的嫌疑是每个循环都会发生的连接.随着数据变得越来越长,R可能会将向量的每个元素复制到一个更长的新向量中.将一小部分(平均500个元素)数据集复制1000次很快.复制较大的(平均5000个元素)数据集10000次较慢.


这不太可能快得多 - 你需要预先分配.
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有