2015-12-08 29 views
5

Tôi muốn tính toán độ lệch từ (trọng số) trung bình cho nhiều biến số trong một data.table.Làm cách nào để tính toán sai lệch so với giá trị trung bình có trọng số trong data.table?

Hãy lấy ví dụ này thiết lập:

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 

tôi có thể tính toán các phương tiện có trọng số xy như sau:

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

(tôi sử dụng tương đối phức tạp as.list(.SD)[...] xây dựng thay vì .SDcols vì lỗi this.)

Tôi đã cố gắng tạo phương tiện cho mỗi hàng, nhưng không tìm thấy cách kết hợp := với lapply().

Trả lời

3

Chỉ cần tinh chỉnh các tính toán trung bình trọng một chút:

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 

Các giải pháp được cập nhật bởi đơn giản hóa ký hiệu gợi ý của @DavidArenburg.

+1

Bạn chỉ có thể làm '. (X, y)' thay vì 'as.list (.SD) [c (" x "," y ")]' .... –

+0

@DavidArenburg Cảm ơn. Nó thực sự đơn giản hơn nhưng cũng mất các tên biến ban đầu, bạn nhận được 'V1' và' V2' thay vì 'x' và' y'. – janosdivenyi

+1

Sau đó '.SD [,. (X, y)]'? –

Các vấn đề liên quan