2016-04-27 16 views
1

私は、4つの変数(datexyz)の約14k観測を含む非常に大きな時系列を持っています。R時系列の次の行と前の行の違いを取得する方法は?

どのように、(現在の値(t)と前回(t-1)との差を計算する関数diff(df$vector, lag = 1)に反して)は、各値の次の値(t+1)との差を計算することができるし、前値(t-1)?

答えて

0

遅れを設定するための要求を理解するために...いくつかのデータを生成している:

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 
0

私が正しくあなたの質問を理解していれば、あなたが望むすべてが、そう= 2

+0

hm no、lag = 2は、現在の値tとt-2の差を計算します。 私はt + 1とt-1の違いを得る必要があります。 –

0

あなたが探していることは2のdiffです! (@Kake_Fiskにより示唆されるようにあなたはdiffないlagを使用する必要があります。)@Coatlessから受け入れ答えからのデータを使用:

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

ができます:

:OPからのコメントの後

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

編集を

あなたのコメントが正しく理解できれば、@ 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 
+0

Rは 'diff(a、2)'を 'diff(a、lag = 2)'と解釈します。私は同じ結果を得ます: 'set。シード(11) =試料(1:10、10) [1] 3 1 5 9 7 8 6 4 2 10 差分(2) [1] 6 6 3 -3 -3 -6 4 diff(a、lag = 2) [1] 6 6 3 -3 -3 4 4 ' –

+0

これがポイントです。 Kake_Fiskは間違っている「遅れ」を示唆し、受け入れられた答えは、ベースRですでに利用可能な関数を構築することによって、正確ではあるが不必要に複雑になります。 – hvollmeier

+0

OK! 'diff(a、lag = 2)'を返し、 't'と' t-2'の間の差を返しますが、オフセットと配列の先頭を設定することで修正できます: 'c(NA、diff(a、 2)) ' –

関連する問題