2015-12-08 3 views
5

Я хотел бы рассчитать отклонения от (взвешенного) среднего значения для многих переменных в data.table.Как рассчитать отклонения от взвешенного среднего в data.table?

Давайте возьмем этот пример набор:

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 

Я могу рассчитать средневзвешенные из x и y следующим образом:

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

(я использую относительно сложную as.list(.SD)[...] конструкцию вместо .SDcols из-за 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

Вы можете просто сделать '. (X, y)' вместо 'as.list (.SD) [c (" x "," y ")]' .... –

+0

@DavidArenburg Спасибо. Это проще, но также теряет исходные имена переменных, вы получаете 'V1' и' V2' вместо 'x' и' y'. – janosdivenyi

+1

Тогда '.SD [,. (X, y)]'? –