我目前正在对数据进行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循环由于数据量而花费了大量时间,我需要优化这段代码,因为它将在更大的数据上运行。是否有任何替代方法可用于代替此循环?
提前致谢!
答案 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循环的第一部分。