Tôi muốn thêm một cột mới vào data.table của tôi. Cột này phải chứa tổng của một cột khác của tất cả các hàng thỏa mãn một điều kiện nhất định. Một ví dụ: data.table của tôi trông như thế này:Làm thế nào để tự tham gia một data.table trên một điều kiện
require(data.table)
DT <- data.table(n=c("a", "a", "a", "a", "a", "a", "b", "b", "b"),
t=c(10, 20, 33, 40, 50, 22, 25, 34, 11),
v=c(20, 15, 16, 17, 11, 12, 20, 22, 10)
)
DT
n t v
1: a 10 20
2: a 20 15
3: a 33 16
4: a 40 17
5: a 50 11
6: a 22 12
7: b 25 20
8: b 34 22
9: b 11 10
Đối với mỗi hàng x và mỗi hàng i, nơi abs (t [i] - t [x]) < = 10, tôi muốn để tính toán
foo = sum(v[i] * abs(t[i] - t[x]))
Trong SQL, tôi sẽ giải quyết vấn đề này bằng cách tự tham gia. Trong R Tôi đã có thể thực hiện việc này bằng cách sử dụng vòng lặp for:
for (i in 1:nrow(DT))
DT[i, foo:=DT[n==DT[i]$n & abs(t-DT[i]$t)<=10, sum(v * abs(t-DT[i]$t))]]
DT
n t v foo
1: a 10 20 150
2: a 20 15 224
3: a 33 16 119
4: a 40 17 222
5: a 50 11 170
6: a 22 12 30
7: b 25 20 198
8: b 34 22 180
9: b 11 10 0
Thật không may tôi phải làm điều này khá thường xuyên và bảng tôi làm việc khá lớn. Cách tiếp cận vòng lặp hoạt động nhưng quá chậm. Tôi chơi xung quanh với gói sqldf, không có bước đột phá thực sự. Tôi rất thích làm điều này bằng cách sử dụng một số phép thuật data.table và có tôi cần sự giúp đỡ của bạn :-). Tôi nghĩ những gì cần thiết là một số loại tự tham gia vào điều kiện rằng sự khác biệt của các giá trị t là nhỏ hơn ngưỡng đó.
Theo dõi: Tôi có câu hỏi tiếp theo: Trong đơn đăng ký của tôi, lần kết nối này được thực hiện lặp đi lặp lại. Sự thay đổi của v, nhưng t và n luôn giống nhau. Vì vậy, tôi đang suy nghĩ về việc bằng cách nào đó lưu trữ những hàng thuộc về nhau. Bất kỳ ý tưởng làm thế nào để làm điều này một cách thông minh?
từ đầu ra của bạn, có vẻ như bạn cũng có điều kiện 'i! = X' đúng không? –
Không. Đối với hàng 9 foo = 0 vì thuật ngữ abs (t-DT [i] $ t) == 0. Nhưng không nên loại trừ i! = X, vì việc tính toán trong ứng dụng của tôi phức tạp hơn một chút như trong ví dụ này và tôi cần hàng x trong đó. – uuazed