40

私が R に慣れていないことを明らかにする可能性が最も高いですが、SPSS では、ラグの実行は非常に簡単です。明らかにこれはユーザー エラーですが、何が欠けていますか?

x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds

結果:

      x y
 [1,] 4 4
 [2,] 6 6
 [3,] 3 3
 [4,] 4 4
 [5,] 3 3
 [6,] 5 5
 [7,] 8 8
 [8,] 9 9
 [9,] 3 3
[10,] 7 7

私は私が見るだろうと思った:

     x y
 [1,] 4 
 [2,] 6 4
 [3,] 3 6
 [4,] 4 3
 [5,] 3 4
 [6,] 5 3
 [7,] 8 5
 [8,] 9 8
 [9,] 3 9
[10,] 7 3

どんなガイダンスでも大歓迎です。

4

13 に答える 13

35

同じ問題がありましたが、zoo や xts を使用したくなかったので、データ フレームの単純なラグ関数を作成しました。

lagpad <- function(x, k) {
  if (k>0) {
    return (c(rep(NA, k), x)[1 : length(x)] );
  }
  else {
    return (c(x[(-k+1) : length(x)], rep(NA, -k)));
  }
}

これは前後に遅れる可能性があります。

x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
     x      
[1,] 1 NA  2
[2,] 2  1  3
[3,] 3  2 NA
于 2012-10-29T19:58:44.477 に答える
29

これに対処する別の方法は、zoo パッケージを使用することです。このパッケージには、結果に NA を埋め込むラグ メソッドがあります。

require(zoo)
> set.seed(123)
> x <- zoo(sample(c(1:9), 10, replace = T))
> y <- lag(x, -1, na.pad = TRUE)
> cbind(x, y)
   x  y
1  3 NA
2  8  3
3  4  8
4  8  4
5  9  8
6  1  9
7  5  1
8  9  5
9  5  9
10 5  5

結果は多変量動物園オブジェクト (強化されたマトリックス) ですが、次の方法で簡単に data.frame に変換できます。

> data.frame(cbind(x, y))
于 2010-08-24T17:28:29.317 に答える
15

lagデータをシフトするのではなく、「タイムベース」をシフトするだけです。 x「タイムベース」がないため、cbind期待どおりに機能しません。1 の「ラグ」が期間を前方cbind(as.ts(x),lag(x))にシフトすることに注意してください。

zoo/xtsを時系列に使用することをお勧めします。zooビネットは特に役に立ちます。

于 2010-08-24T17:15:17.083 に答える
8

標準の R 関数だけを使用すると、これははるかに簡単な方法で実現できます。

x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
于 2014-12-02T00:11:53.320 に答える
7

lag()ベアマトリックスを使用しようとしているのに対し、時系列で動作します。 この古い質問embedは、代わりに次のように使用することを提案しています。

lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)

例えば

> x
[1] 8 2 3 9 8 5 6 8 5 8
> lagmatrix(x, 1)
      [,1] [,2]
 [1,]    8   NA
 [2,]    2    8
 [3,]    3    2
 [4,]    9    3
 [5,]    8    9
 [6,]    5    8
 [7,]    6    5
 [8,]    8    6
 [9,]    5    8
[10,]    8    5
于 2010-08-24T17:18:23.320 に答える
2
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
于 2013-03-18T18:34:23.093 に答える
0

同じことを行う簡単な方法は、データを新しいデータ フレームにコピーし、インデックス番号を変更することです。元のテーブルがギャップなしで順次インデックス付けされていることを確認してください

例えば

tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)

元のデータ フレームと同じデータ フレームに入れたい場合は、cbind 関数を使用します。

于 2016-10-27T13:26:25.263 に答える
-1

ラグを取り除くだけです。y の行を次のように変更します。

y <- c(NA, x[-1])
于 2010-08-24T20:20:07.663 に答える