繁体   English   中英

如何获得R时间序列中下一行和上一行之间的差异?

[英]How to get the difference between next and previous row in an R time series?

我有一个非常大的时间序列,包括4个变量( datexyz )的大约14k个观测z

我怎么能(与函数diff( df$vector, lag = 1)相反,它计算当前值( t )和前一个( t-1 )之间的差值),为每个值计算下一个值之间的差值值( t+1 )和前一个值( t-1 )?

如果我正确理解你的问题,你想要的只是设置lag = 2。

所以,要了解请求...生成一些数据:

set.seed(11)
a = sample(1:10, 10)

数据如下:

3  1  5  9  7  8  6  4  2 10

需要T+1 vs. T-1

T = 0 => No computation
T = 1 => 5 - 3 = 2
T = 2 => 9 - 1 = 8
...
T = 9 => 10 - 4 = 6
T = 10 => No computation

随着这个建立......

#' Future Difference
#' 
#' Obtain the lagged difference between X[t+1+lag] - X[t-1-lag]
#' @param x   A \code{vec}
#' @param lag A \code{integer} indicating the lag
#' @return A \code{vec} with differences taken at T+lag v. T-lag
#' @examples
#' set.seed(11)
#' a = sample(1:10, 12)
#' fdiff(a)
fdiff = function(x, lag = 1){
  # Number of obs
  n = length(x)

  # Trigger error to prevent subset
  if(n < 2+lag){stop("`x` must be greater than `2+lag`")}

  # X_(T+1) - X_(T-1)
  x[(2+lag):n] - x[1:(n-lag-1)]
}

调用它在a给:

fdiff(a)

2  8  2 -1 -1 -4 -4  6

你要找的是2的diff (你应该使用@Kake_Fisk建议的diff not lag 。)使用@Coatless接受的答案中的数据:

set.seed(11)
a = sample(1:10, 10)
diff(a,2)

得到:

[1]  2  8  2 -1 -1 -4 -4  6

OP评论后编辑:

如果我理解你的评论,那么@coatless接受的回答并不能满足你的要求。 您正在寻找一个系列,它为您提供每个元素与其邻居的上一个和下一个差异。 所以这个系列的长度必须是原始系列的2倍减去2(因为第一个元素没有前一个值,最后一个没有下一个值)。 一种可能的解决方案可能是

set.seed(11)
a = sample(1:10, 10)
a
[1]  3  1  5  9  7  8  6  4  2 10

prev <- a[1:(length(a)-1)] - a[2:length(a)] # series of previous values
nxt <- -1 * prev # series of next values

nextPrevValues <- rep(0,2 * (length(a)-1))
for(i in 1:length(a)-1){
  nextPrevValues[2*i-1] <- nxt[i]
  nextPrevValues[2*i] <- prev[i]
}

从第一个元素到下一个元素的差异开始,您可以获得每个元素的上一个和下一个元素。 最后一个元素只有一个前一个值。

nextPrevValues
 [1] -2  2  4 -4  4 -4 -2  2  1 -1 -2  2 -2  2 -2  2  8 -8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM