2015-12-08 12 views
5

Chciałbym obliczyć odchylenia od (ważonej) średniej dla wielu zmiennych w data.table.Jak obliczyć odchylenia od średniej ważonej w data.table?

Weźmy ten przykład zestaw:

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 

mogę obliczyć ważonych środków z x i y następująco:

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

(używam stosunkowo skomplikowany as.list(.SD)[...] konstrukt zamiast .SDcols z powodu błędu this).

Próbowałem najpierw utworzyć środki dla każdego wiersza, ale nie znalazłem sposobu połączenia := z.

Odpowiedz

3

Wystarczy dostosować średnią ważoną Obliczanie trochę:

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 

Rozwiązaniem jest aktualizowany przez sugerowanej notacyjnego uproszczenia @DavidArenburg.

+1

Możesz po prostu zrobić '. (X, y)' zamiast 'as.list (.SD) [c (" x "," y ")]' .... –

+0

@DavidArenburg Dzięki. Jest to prostsze, ale także traci oryginalne nazwy zmiennych, otrzymujesz 'V1' i' V2' zamiast 'x' i' y'. – janosdivenyi

+1

Następnie '.SD [,. (X, y)]'? –