【发布时间】: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