2015-12-08 9 views
5

data.tableの多くの変数の(重み付けされた)平均からの偏差を計算したいと考えています。data.tableの加重平均からの偏差を計算するには?

のは、この例のセットみましょう。次のように私はxyの加重平均を計算することができ

mydt <- data.table(
    id = c(1, 2, 2, 3, 3, 3), 
    x = 1:6, 
    y = 6:1, 
    w = rep(1:2, 3) 
) 

mydt 
    id x y w 
1: 1 1 6 1 
2: 2 2 5 2 
3: 2 3 4 1 
4: 3 4 3 2 
5: 3 5 2 1 
6: 3 6 1 2 

を:

mydt[ 
    , 
    lapply(
     as.list(.SD)[c("x", "y")], 
     weighted.mean, w = w 
    ), 
    by = id 
] 

(私が代わりに.SDcolsの比較的複雑as.list(.SD)[...]構文を使用しますthisバグのため)

各行の手段を最初に作成しようとしましたが、:=lapply()を組み合わせる方法が見つかりませんでした。

答えて

3

だけビット加重平均計算を微調整:

mydt[ 
    , 
    lapply(
     .SD[, .(x, y)], 
     function(var) var - weighted.mean(var, w = w) 
    ), 
    by = id 
] 

    id  x  y 
1: 1 0.0000 0.0000 
2: 2 -0.3333 0.3333 
3: 2 0.6667 -0.6667 
4: 3 -1.0000 1.0000 
5: 3 0.0000 0.0000 
6: 3 1.0000 -1.0000 

溶液を@DavidArenburgの提案表記簡素化によって更新されます。

+1

as.list(.SD)[c( "x"、 "y")] '....の代わりに'。(x、y) 'を実行するだけでよいのですが... –

+0

@DavidArenburgありがとう。確かに単純ですが、元の変数名も失われていると、 'x'と' y'の代わりに 'V1'と' V2'が得られます。 – janosdivenyi

+1

'.SD [、。(x、y)]'? –

関連する問題