8

重複の可能性:
`ddply`(または同様のもの)はスライディングウィンドウを実行できますか?

data.frameで動作するが、それを行列に変換しないrollapply(標準RまたはCRANパッケージ内)のような関数はありますか?rollapplyはdata.frameで使用できますが、data.frameのタイプが混在している場合は、データの各ウィンドウが文字(行列)に変換されます。

rollapplyのように幅、na.pad、alignなどをサポートする関数が好きです

混合型のdata.frameを取得します

test = data.frame( Name = c( "bob" , "jane" , "joe" ) , Points = c( 4 , 9 , 1 ) )

ウィンドウサイズ2でロールしたいとします。FUNの最初の反復は、テストの行1と2のみを含むdata.frameで呼び出されます。

したがってRollapplyThatRespectsDataFrame( ... , FUN = function( x ) { ... } )、最初の反復で設定されますx = data.frame( Name = c( "bob" , "jane" ) , Points = c( 4 , 9 ) )

2番目の反復は、の行2と3を持つdata.frameですtest

基本的に、この新しい関数は、data.framesで正しく機能することを除いて、rollapplyと同じことを行います。行列には変換されません。

4

1 に答える 1

8

これを試して:

> library(zoo)
> DF <- data.frame(a = 1:10, b = 21:30, c = letters[1:10])
> replace(DF, 1:2, rollapply(DF[1:2], 3, sum, fill = NA))
    a  b c
1  NA NA a
2   6 66 b
3   9 69 c
4  12 72 d
5  15 75 e
6  18 78 f
7  21 81 g
8  24 84 h
9  27 87 i
10 NA NA j

いくつかの議論の後に質問に追加された例に関して、そのような機能は、rollapplyそれを行インデックスに適用することによって、その上に階層化することができます。

> lapply(as.data.frame(t(rollapply(1:nrow(test), 2, c))), function(ix)test[ix, ])
$V1
  Name Points
1  bob      4
2 jane      9

$V2
  Name Points
2 jane      9
3  joe      1

そしてここでそれはもう少し良くまとめられています:

rollapply.data.frame <- function(data, ..., fill = NULL, FUN, 
        simplify = function(x) do.call(rbind, x)) {
    fill0 <- if (!is.null(fill)) NA
    result <- lapply(
       as.data.frame(t(rollapply(1:nrow(data), ..., fill = fill0, FUN = c))), 
       function(ix) {if (all(is.na(ix))) fill else FUN(data[ix, ])}
    )
    simplify(result)
}

> rollapply(test, 2, FUN = identity, simplify = identity)
$V1
  Name Points
a  bob      4
b jane      9

$V2
  Name Points
b jane      9
c  joe      1

> rollapply(test, 2, FUN = identity, fill = NA, simplify = identity)
$V1
  Name Points
a  bob      4
b jane      9

$V2
  Name Points
b jane      9
c  joe      1

$V3
[1] NA
于 2012-12-07T22:49:31.583 に答える