1

我是 R 的初学者,我写了这个简单的循环:

for(i in 1:12000){
    if(v$piano.tariff[i] == 2) {v$piano.tariff[i] = 0}
    else {v$piano.tariff[i] = 1}
}

其中 v 是一个数据框,piano.tariff 是它的列之一。循环所做的只是将piano.tariff 列的每个值从它们的初始值2 和5 更改为1 或0。

现在,代码可以工作了,但问题是它慢得离谱。最多需要4-5分钟 才能完成!在 C++ 或 C# 中,这样的循环几乎不需要几秒钟。

为什么这么慢?有没有更快的方法来实现这一点?或者仅仅是 R 很慢,仅此而已?

4

3 回答 3

7

您可能想改用ifelse矢量化 R 函数,它会更快

ifelse(v$piano.tariff==2, 0, 1)

由于您没有提供可重现的示例,因此我无法对性能进行基准测试。

于 2013-04-08T09:16:59.793 回答
5

我认为您可以在这里尝试矢量化方法。

编辑 感谢 Henrik,以前的版本有点偏离。我认为新方法还可以。

twos <- v$piano.tariff == 2
notwos <- v$piano.tariff != 2
v[twos, "piano.tariff"] <- 0
v[notwos, "piano.tariff"] <- 1

对你来说够快吗?:)

于 2013-04-08T09:17:00.280 回答
1

通常,您需要小心 R 中的循环,但更特别是循环内的分配,例如v$piano.tariff[i] = v$piano.tariff[i]+1导致整个向量被重新分配。

有关此类问题的更多详细信息,请参阅有关此类问题的 Patrick Burns 在线书籍The R Inferno 。

于 2013-04-08T09:20:50.227 回答