web-dev-qa-db-ja.com

Rベクトル/データフレームの基本的な遅延

私は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

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

35
Btibert3

これに対処する別の方法は、Zooパッケージを使用することです。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

結果は多変量Zooオブジェクト(拡張マトリックス)ですが、次の方法で簡単にdata.frameに変換されます

> data.frame(cbind(x, y))
27
Gavin Simpson

私は同じ問題を抱えていましたが、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
26
Andrew

lagはデータをシフトせず、「タイムベース」のみをシフトします。 xには「タイムベース」がないため、cbindは期待どおりに機能しません。 cbind(as.ts(x),lag(x))を試して、1の「遅れ」が周期をシフトすることに注意してくださいforward

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

15
Joshua Ulrich

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
7
zwol

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

x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
5
Alexander Radev

私にとって最も簡単な方法は次のように見えます:

require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
4
matt_jay

これは、ベクトルまたは行列と負の遅延に対応する必要があります。

lagpad <- function(x, k=1) {
  i<-is.vector(x)
  if(is.vector(x)) x<-matrix(x) else x<-matrix(x,nrow(x))
  if(k>0) {
      x <- rbind(matrix(rep(NA, k*ncol(x)),ncol=ncol(x)), matrix(x[1:(nrow(x)-k),], ncol=ncol(x)))
  }
  else {
      x <- rbind(matrix(x[(-k+1):(nrow(x)),], ncol=ncol(x)),matrix(rep(NA, -k*ncol(x)),ncol=ncol(x)))
  }
  if(i) x[1:length(x)] else x
}
2
Jeff Cole
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
2
Paweł Sakowski

base Rdata.tableの2つのオプション:

baseShiftBy1 <- function(x) c(NA, x[-length(x)])
baseShiftBy1(x)
[1] NA  3  8  4  8  9  1  5  9  5

data.table::shift(x)
[1] NA  3  8  4  8  9  1  5  9  5   

データ:

set.seed(123)
(x <- sample(c(1:9), 10, replace = T))
[1] 3 8 4 8 9 1 5 9 5 5
0
sindri_baldur

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

例えば.

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

元と同じデータフレームで使用する場合は、cbind関数を使用します

0
Abhishek Lahiri