我是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很慢,那就是它?
答案 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的在线书籍。