gpt4 book ai didi

r - 昂贵的for和if else循环的替代方案

转载 作者:行者123 更新时间:2023-12-03 17:32:08 26 4
gpt4 key购买 nike

我目前拥有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中,循环通常非常耗时。最好尽可能避免循环。如果搜索“矢量化”,您将发现大量讨论该主题的线程和教程。

只是代码的简单示例:

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

关于r - 昂贵的for和if else循环的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21696144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com