【发布时间】:2017-10-07 18:16:09
【问题描述】:
我正在尝试创建一个函数,将最接近的 n 值与给定日期相加。因此,如果我有 5 周的数据,并且 n=2,则第 1 周的值将是第 2 周和第 3 周的总和,第 2 周的值将是第 1 周和第 3 周的总和,等等。示例:
library(dplyr)
library(data.table)
Week <- 1:5
Sales <- c(1, 3, 5, 7, 9)
frame <- data.table(Week, Sales)
frame
Week Sales Recent
1: 1 1 8
2: 2 3 6
3: 3 5 10
4: 4 7 14
5: 5 9 12
我想创建一个函数来为我执行此操作,并输入最近的 n(不仅仅是 2),但现在我想正确设置 2。这是我使用滞后/领先的函数:
RecentSum = function(Variable, Lags){
Sum = 0
for(i in 1:(Lags/2)){ #Lags/2 because I want half values before and half after
#Check to see if you can go backwards. If not, go foward (i.e. use lead).
if(is.na(lag(Variable, i))){
LoopSum = lead(Variable, i)
}
else{
LoopSum = lag(Variable, i)
}
Sum = Sum + LoopSum
}
for(i in 1:(Lags/2)){
if(is.na(lead(Variable, i))){ #Check to see if you can go forward. If not, go backwards (i.e. use lag).
LoopSum = lag(Variable, i)
}
else{
LoopSum = lead(Variable, i)
}
Sum = Sum + LoopSum
}
Sum
}
当我执行RecentSum(frame$Sale,2) 时,我得到[1] 6 10 14 18 NA,这是错误的,原因有很多:
- 我的
if声明仅在第一周出现,因此对于滞后始终为 NA,对于领先始终为非 NA。 - 我需要有一种方法来查看它是否第一次使用滞后/超前。第一个值是
6而不是8,因为第一个for 循环将它发送到lead(_,1),但随后第二个for 循环执行相同操作。我想不出如何让我的第二个 for 循环识别这一点。
是否有一个函数或库 (Zoo?) 可以使这项任务变得简单?为了练习/理解,我想让我自己的函数工作,但在这一点上,我宁愿完成它。
谢谢!
【问题讨论】:
-
在尝试回答您的问题之前,您当前的设置有两点需要注意。首先,您正在调用一个只循环一次的 for 循环,因为
i in 1:(2/1)与i in 1:1相同。所以这就解释了为什么它只在第一周做。其次,如果lead和lag是来自dplyr函数的函数,那么我不相信你正在正确地实现它们。