为什么R中的这个简单循环如此缓慢?

时间:2013-04-08 09:10:26

标签: r for-loop

我是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 ++ o C#这样的循环几乎不需要几秒钟。

为什么这么慢?有更快的方法来实现这个吗?或者只是R很慢,那就是它?

3 个答案:

答案 0 :(得分:7)

您可能希望使用ifelse而不是矢量化R函数,它会更快

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

由于您没有提供reproducible example我无法对性能进行基准测试。

答案 1 :(得分:5)

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

修改的 感谢Henrik,之前的版本有点偏。我认为新方法还可以。

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

对你来说足够快? :)

答案 2 :(得分:1)

一般来说,你需要注意R中的循环,更特别是在v$piano.tariff[i] = v$piano.tariff[i]+1之类的循环中的赋值,这会导致整个向量被重新分配。

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