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

为什么R中的这个简单循环如此缓慢?,r,for-loop,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.com是其中一列。循环所做的只是将piano.tariff列的每个值从初始值2和5更改为1或0 现在,代码可以工作了,但问题是它的速度太慢了。最多需要4-5分钟才能完成!在C++ +C语言中,这样的循环几乎不需要

我是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.com是其中一列。循环所做的只是将piano.tariff列的每个值从初始值2和5更改为1或0

现在,代码可以工作了,但问题是它的速度太慢了。最多需要4-5分钟才能完成!在C++ +C语言中,这样的循环几乎不需要几秒钟。
为什么这么慢?有没有更快的方法来实现这一点?或者仅仅是R速度慢,就这样?

您可能想使用
如果else
而不是矢量化的R函数,它会更快

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

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

您可能希望使用
ifelse
,这是一个矢量化的R函数,速度会更快

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

因为你没有提供一个测试,所以我无法对性能进行基准测试。

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

编辑 多亏了亨里克,以前的版本有点过时了。我认为新方法是可以的

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

twos我想你可以在这里尝试一种矢量化的方法

编辑 多亏了亨里克,以前的版本有点过时了。我认为新方法是可以的

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

twos一般来说,您需要注意R中的循环,但更具体地说,循环内部的赋值,如
v$piano.tarrium[i]=v$piano.tarrium[i]+1
,这会导致整个向量被重新分配


请参阅Patrick Burns关于这类问题的在线书籍,了解更多详细信息。

一般来说,您需要注意R中的循环,但更具体地说,循环中的赋值,如
v$piano.private[i]=v$piano.private[i]+1
,这会导致整个向量被重新分配


有关这方面的更多详细信息,请参阅Patrick Burns关于这类问题的在线书籍。

这是即时的,谢谢!!虽然我稍微修改了一下,因为我知道另一个值是5,所以我在第二行中使用了“==”,否则正如亨里克所指出的,它将无法正常工作。@Master\u看不到我的编辑。亨里克注意到我的第一个方法是错误的。这是瞬间的,谢谢!!虽然我稍微修改了一下,因为我知道另一个值是5,所以我在第二行中使用了“==”,否则正如亨里克所指出的,它将无法正常工作。@Master\u看不到我的编辑。Henrik指出,我的第一种方法是错误的。如果你对R比较新,那么很多关于循环和向量化的问题都在中得到了回答:如果你对R比较新,那么很多关于循环和向量化的问题都在中得到了回答: