【发布时间】:2018-03-09 09:01:41
【问题描述】:
在我的工作数据集中,我试图计算批发和收入变化的每周值。该代码似乎有效,但我的估计显示运行看似简单的计算需要大约 75 小时。下面是在这个较小的数据集上运行大约 2m 的通用可重现版本:
########################################################################################################################
# MAKE A GENERIC REPORDUCIBLE STACK OVERFLOW QUESTION
########################################################################################################################
# Create empty data frame of 26,000 observations similar to my data, but populated with noise
exampleData <- data.frame(product = rep(LETTERS,1000),
wholesale = rnorm(1000*26),
revenue = rnorm(1000*26))
# create a week_ending column which increases by one week with every set of 26 "products"
for(i in 1:nrow(exampleData)){
exampleData$week_ending[i] <- as.Date("2016-09-04")+7*floor((i-1)/26)
}
exampleData$week_ending <- as.Date(exampleData$week_ending, origin = "1970-01-01")
# create empty columns to fill
exampleData$wholesale_wow <- NA
exampleData$revenue_wow <- NA
# loop through the wholesale and revenue numbers and append the week-over-week changes
for(i in 1:nrow(exampleData)){
# set a condition where the loop only appends the week-over-week values if it's not the first week
if(exampleData$week_ending[i]!="2016-09-04"){
# set temporary values for the current and past week's wholesale value
currentWholesale <- exampleData$wholesale[i]
lastWeekWholesale <- exampleData$wholesale[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$wholesale_wow[i] <- currentWholesale/lastWeekWholesale -1
# set temporary values for the current and past week's revenue
currentRevenue <- exampleData$revenue[i]
lastWeekRevenue <- exampleData$revenue[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$revenue_wow[i] <- currentRevenue/lastWeekRevenue -1
}
}
任何帮助理解为什么这需要这么长时间或如何减少时间将不胜感激!
【问题讨论】:
-
可能不是主要问题,但是...不要将字符串解析为循环中的日期;只需在某处保存
d0 = as.Date("2016-09-04")并使用它。也不要!=与必须解析到日期的字符串相比。我怀疑代码的主要部分可以写成合并/连接而不是循环。 -
这看起来不错且可重现,但(至少在将来)我建议也制作 minimal 示例。与 26 种产品和 140 周相比,在每个步骤中检查数据以了解 2 种产品和 4 周的情况要容易得多。
-
感谢您的反馈!我不想过分简化,但你说得对,它本来可以更简约。下次我会记住这一点。
-
这绝对是最困难的部分 - 尽可能少但仍然说明问题:)
标签: r performance loops subset