1

data.table クラスとして時系列データがあり、各列 (観測点) には、スライディング ウィンドウ (30 幅) 内でカウントしたい値があります。rle(sort(x)) を使用して、rollapply 内の各値をカウントしようとしましたが、機能していません。

たとえば、以下のようなテーブルがある場合、

dt <- data.frame(v1=c(1,0,1,4,4,4,4,4),v2=c(1,1,1,4,3,3,3,3),
          v3=c(0,1,1,3,3,3,3,2),v4=c(1,1,0,3,3,3,3,3),
       v5=c(1,1,1,5,5,5,5,5))

私はこのように試しました;

rollapply(dt, 3, function(x) {rle(sort(x))$values; rle(sort(x))$length})

しかし、結果は意味がありません。方向性を教えてください...

4

1 に答える 1

3

解決策 1目的が 3 つの値のローリング カウントを取得することであると仮定すると、次のことを試してください。

m <- as.matrix(dt)
levs <- sort(unique(c(m)))
f <- function(x) table(factor(x, levs))
r <- rollapply(m, 3, f)

ここでlevsは 0、1、...、5 であるため、関数の適用ごとに、0、1、...、5 のカウントを持つ長さ 6 のベクトルを取得します。5 つの入力列があるため、このような関数を各列に適用すると、5 * 6 = 30 列の出力が得られます。

rollapplyは、データ フレームではなく、マトリックスまたは Zoo オブジェクトで機能するため、変換したことに注意してください。また、各関数アプリケーションが同じ長さのベクトルを出力するようにするために、各入力を同じレベルの因子に変換します。

ご了承ください:

ra <- array(r, c(6, 6, 5))

で形成される行列を ra[,,i] とする 3 次元配列を与えるrollapply(dt[, i], 3, f).つまり、マトリックスra[,,i]には、列 i の各アプリケーションの行がありf、その行の列は 0、1、...、5 の数を数えます。

もう 1 つの可能性は、結果リストのコンポーネントとして同じ 5 つの行列 (入力列ごとに 1 つ) を与えるものです。

lapply(dt, rollapply, 3, f)

たとえば、次のことを考えてみましょう。出力の行 1 は、f on の最初の適用dt[,1]が 1 つの 0 と 2 つの 1 を持ち、他の値がないことを示しています。これは、r[,,1]またはから 取得することもできlapply(dt, rollapply, 3, f)[[1]]ます。

> rollapply(dt[, 1], 3, f)
     0 1 2 3 4 5
[1,] 1 2 0 0 0 0  <- dt[1:3,1] has 1 zero and 2 ones
[2,] 1 1 0 0 1 0  <- dt[2:4,1] has 1 zero and 1 one and 1 four, etc.
[3,] 0 1 0 0 2 0
[4,] 0 0 0 0 3 0
[5,] 0 0 0 0 3 0
[6,] 0 0 0 0 3 0

解決策 2

これは、出力のセル 1,1 を見ると、 に 1 つの 0 と 2 つの 1 があることを示していますdt[1:3,1]。出力のセル 2,1 を見ると、0 が 1 つ、1 が 1 つ、4 が 1 つdt[2:4,1]などであることがわかります。

> g <- function(x) { tab <- table(x); toString(paste(names(tab), tab, sep = ":")) }
> sapply(dt, rollapply, 3, g) # or rollapply(m, 3, g) where m was defined in solution 1
     v1              v2              v3         v4              v5        
[1,] "0:1, 1:2"      "1:3"           "0:1, 1:2" "0:1, 1:2"      "1:3"     
[2,] "0:1, 1:1, 4:1" "1:2, 4:1"      "1:2, 3:1" "0:1, 1:1, 3:1" "1:2, 5:1"
[3,] "1:1, 4:2"      "1:1, 3:1, 4:1" "1:1, 3:2" "0:1, 3:2"      "1:1, 5:2"
[4,] "4:3"           "3:2, 4:1"      "3:3"      "3:3"           "5:3"     
[5,] "4:3"           "3:3"           "3:3"      "3:3"           "5:3"     
[6,] "4:3"           "3:3"           "2:1, 3:2" "3:3"           "5:3"     

追加: 追加の議論と解決策 2.

于 2014-01-24T12:58:01.197 に答える