2

複数列のデータテーブルに対して rollapply 関数を使用したいと思います。つまり、各列を独立して使用できるようにしたいと考えています。たとえば、次のデータブルを考えてみましょう。

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
> DT
   x y v
1: a 1 1
2: a 3 2
3: a 6 3
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9

次に、rollapply をローリング サブセットとして使用して、列 2 と 3 の 3 つの要素のローリング平均を計算し、それらを外部変数に保存したいと思います。

> r1= NA; r2 = NA
> ft=function(x) { r1=mean(x[,2,with=FALSE]) ; r2=mean(x[,3,with=FALSE]) }
> rollapply(DT, width=3, ft)
 Error in x[, 2, with = FALSE] : incorrect number of dimensions 

便利ではないこのエラーが発生したことを除いて、なぜ機能しないのですか?

出力は次のようになります。

> r1
[1] 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333
> r2
[1] 2 3 4 5 6 7 8
4

2 に答える 2

3

のみを使用して別のオプションを追加するdata.tableだけです

library(data.table) # v1.9.6+

ローリング平均関数を定義する

rollMean <- function(x, n) Reduce(`+`, shift(x, 0L:(n - 1L)))/n

指定しながら複数列に適用.SDcols

DT[, lapply(.SD, rollMean, 3L), .SDcols = y:v]
#           y  v
# 1:       NA NA
# 2:       NA NA
# 3: 3.333333  2
# 4: 3.333333  3
# 5: 3.333333  4
# 6: 3.333333  5
# 7: 3.333333  6
# 8: 3.333333  7
# 9: 3.333333  8
于 2015-10-27T11:04:55.593 に答える
2

あなたはほとんどそこにいて、次のことができます:

lapply(DT[,2:3], function(x) rollapply(x,width=3, FUN=mean))
#$y
#[1] 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333

#$v
#[1] 2 3 4 5 6 7 8
于 2015-10-27T10:48:18.777 に答える