2015-12-08 18 views
5

Vorrei calcolare le deviazioni dalla media (ponderata) per molte variabili in un data.table.Come calcolare le deviazioni dalla media ponderata in data.table?

Prendiamo questo esempio serie:

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 

posso calcolare le medie ponderate dei x e y come segue:

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

(uso relativamente complicata as.list(.SD)[...] costrutto anziché .SDcols a causa del bug this.)

Ho provato a creare prima i mezzi per ogni riga, ma non ho trovato il modo di combinare := con lapply().

risposta

3

Basta modificare il calcolo della media ponderata un po ':

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 

La soluzione viene aggiornato dalla semplificazione notazione suggerito di @DavidArenburg.

+1

Si potrebbe semplicemente fare '. (X, y)' invece di 'as.list (.SD) [c (" x "," y ")]' .... –

+0

@DavidArenburg Grazie. È più semplice, ma perde anche i nomi delle variabili originali, si ottiene 'V1' e' V2' invece di 'x' e' y'. – janosdivenyi

+1

Quindi '.SD [,. (X, y)]'? –

Problemi correlati