在R中滞后多个时间段

时间:2013-07-29 14:24:05

标签: r dataframe time-series

我试图在数据框架中滞后一些变量(并明确避免使用时间序列),并且得到了一个有趣的结果。确切地说,我试图将一些滞后数据组合成一个对象,即称为“顺序”的列的1和2周期滞后。这就是我正在做的事情:

time=18:29
orders=c(76,77,78,79,72,81,79,85,93,81,72,60)

 data=data.frame(time=time,orders=orders)

 lagage<-lag(data$orders, k=-1:-2)

Error in `tsp<-`(`*tmp*`, value = p - (k/p[3L]) * c(1, 1, 0)) : 
invalid time series parameters specified
In addition: Warning messages:
1: In if (k != round(k)) { :
the condition has length > 1 and only the first element will be used
2: In (k/p[3L]) * c(1, 1, 0) :
 longer object length is not a multiple of shorter object length

我很困惑为什么我收到这个错误,因为我之前已多次使用lag()函数而没有任何问题。也许这对我来说是一个大脑放屁,但我想和你们一起检查一下发生了什么。

编辑

这里应该更加明确 - 我希望填补受NAs滞后影响的索引。我在上面展示的滞后是我将数据帧强制转换为动物园对象,如下所示:

data<-as.zoo(data)
lagage<-lag(data$orders, k=-1:-3)


  lag-1 lag-2 lag-3
2     76    NA    NA
3     77    76    NA
4     78    77    76
5     79    78    77
6     72    79    78
7     81    72    79
8     79    81    72
9     85    79    81
10    93    85    79
11    81    93    85
12    72    81    93

当然,我可以将新数据重新强制回数据框,但是要避免这些步骤。

2 个答案:

答案 0 :(得分:2)

请尝试以下方法:

 sapply(-1:-2, function(k) lag(data$orders, k=k))

如果您想保留属性

,可能需要使用, simplify=FALSE

答案 1 :(得分:2)

在前一个答案的基础上,试试这个:

foo <- function(k) c(rep(NA, abs(k)), lag(data$orders, k=k)[abs(k):length(data$orders)])
sapply(-1:-2, foo)
对于向量,

lag将返回相同长度的向量,当您将它们组合在数据框或矩阵中时,您将获得相同的序列。它不会在末尾填充NA和drop元素,这是在数据框或矩阵中滞后时所需的。