【问题标题】:Alternative for an expensive for and if else loop替代昂贵的 for 和 if else 循环
【发布时间】:2014-03-08 21:39:02
【问题描述】:

我目前有 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 循环需要大量时间,我需要优化此代码,因为它将在更大的数据上运行。有没有可以用来代替这个 for 循环的替代方法?

提前致谢!

【问题讨论】:

  • R 是(结构的)变化时复制,听起来你可能是指数增长的对象。如果您必须使用 for 循环,请确保尽可能预先分配内存大小。查看R Inferno,第二个环可能与您有关。

标签: r optimization if-statement for-loop


【解决方案1】:

循环在 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 循环的第一部分。

【讨论】:

  • 哇!这似乎很简单!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2023-04-09
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多