用 R 在向量中思考

Posted

技术标签:

【中文标题】用 R 在向量中思考【英文标题】:Thinking in Vectors with R 【发布时间】: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 一样,我已经走得很远,宝贝。 嘿,相信我,这没什么。很久以前我在列表中发布了一些令人尴尬的问题。很多,很多更尴尬。 【参考方案1】:

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

为了使用 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 个样本。我知道向量更快,但是该死。我假设使用循环需要 100,000 个循环一个多小时,而矢量方法需要

R 中的向量对我来说速度非常快。我想这就是为什么我是经济学家而不是计算机科学家的原因。

【讨论】:

JD:调查 do.call、sapply、lapply 和 tapply。这些对我来说是 R 的转折点。匿名函数也很有用。 @Vince 什么是“匿名函数?”【参考方案2】:

回答您关于为什么 10000 循环比您的 1000 循环花费更长的时间的问题:

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

【讨论】:

今天我想出了更快的向向量添加元素的方法:追加,所以年份向量现在看起来像年 这不太可能快得多 - 您需要预先分配。

以上是关于用 R 在向量中思考的主要内容,如果未能解决你的问题,请参考以下文章

r中如何判断数据框和向量

R语言中向量的定义以及基本操作

用R中定义的向量替换行名

R语言实现 支持向量机

R:用向量中的项目替换NA

在R中添加带有条件的向量元素