替代昂贵的for和if else循环

时间:2014-02-11 07:56:25

标签: r optimization if-statement for-loop

我目前正在对数据进行500,000次观察,并且我的R代码中有一步可以执行以下操作 -

attach(ds) 
weight <- rep(NA,length(date))
sales_base <- rep(NA,length(date))
cumsales <- rep(NA,length(date))    

weight[dup_no!=0 & month(date)==7] = lag_sales[dup_no!=0 & month(date)==7]
sales_base[dup_no!=0 & month(date)==7] = cumsales[dup_no!=0 & month(date)==7]
cumsales [dup_no!=0 & month(date)==7] = 1+ disc[dup_no!=0 & month(date)==7]

for(i in 2:length(permno))
{
  if(dup_no[i]!=0 & month(date[i])!=6 & !is.na(lag_sales[i]) & (lag_sales[i])>0)
   {
     cumsales[i] = cumsales[i-1]*(1+disc[i])    
     weight[i] = cumsales[i]*sales_base[i-1]
   } 
if(dup_no[i]!=0 & month(date[i])!=6 & (lag_sales[i])<=0)
   {
     cumsales[i] = cumsales[i-1]*(1+disc[i])
     weight_port[i] = NA
   }
}

(公式可能没有意义,因为我没有向您展示整个代码。) 前三行创建3列值0.接下来的三行在满足一组条件的情况下填充列中单元格的值。下一个for循环尝试通过基于先前填充的单元格值(从第5,6,7行获得)计算新值来填充列的剩余空值。

这里的for循环由于数据量而花费了大量时间,我需要优化这段代码,因为它将在更大的数据上运行。是否有任何替代方法可用于代替此循环?

提前致谢!

1 个答案:

答案 0 :(得分:2)

在R中循环通常非常耗时。尽可能避免使用它们。如果您搜索“矢量化”,您会发现大量的线程和教程讨论该主题。

只是您的代码的简短示例:

index <- dup_no!=0 & month(date)!=6 & !is.na(lag_sales) & (lag_sales)>0
cumsales[index] <- cumsales[which(index)-1]*(1+disc[index])  
weight[index] <- cumsales[index]*sales_base[which(index)-1]

这应该可以替换for循环的第一部分。