Tôi đang tìm giải pháp thay thế tốt nhất cho bài tập chưa được thực hiện (với kiến thức của tôi) bằng cách tham chiếu trong một dữ liệu. Có thể theo nhóm. Sử dụng ví dụ data.table,data.table thay thế hiệu quả để gán theo nhóm như DT [, x: = f (y), bởi = z]?
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
x y v
[1,] a 1 1
[2,] a 3 2
[3,] a 6 3
[4,] b 1 4
[5,] b 3 5
[6,] b 6 6
[7,] c 1 7
[8,] c 3 8
[9,] c 6 9
Tôi muốn thêm một cột z mới, chứa f (y, v) được phân nhóm theo các giá trị của x (cho phép chụp f (y, v) = trung bình (y) + v). Lưu ý rằng tôi không muốn in hoặc lưu trữ kết quả tính toán này như trong
DT[,mean(y)+v,by=x]
x V1
[1,] a 4.333333
[2,] a 5.333333
[3,] a 6.333333
[4,] b 7.333333
[5,] b 8.333333
[6,] b 9.333333
[7,] c 10.333333
[8,] c 11.333333
[9,] c 12.333333
mà là tôi muốn thêm vào kết quả để DT:
x y v V1
[1,] a 1 1 4.333333
[2,] a 3 2 5.333333
[3,] a 6 3 6.333333
[4,] b 1 4 7.333333
[5,] b 3 5 8.333333
[6,] b 6 6 9.333333
[7,] c 1 7 10.333333
[8,] c 3 8 11.333333
[9,] c 6 9 12.333333
data.table của tôi có 262 MB, sao cho
DT <- DT[,transform(.SD,mean(y)+v),by=x]
không phải là một tùy chọn vì tôi không thể khớp DT hai lần trong bộ nhớ (điều này được ngụ ý bởi thao tác sao chép). Thực tế là tôi chưa bao giờ thấy kết thúc hoạt động đó.
Tôi có những lựa chọn nào (cho đến khi data.table đi kèm với DT [, z: = mean (y) + v, by = x])?
Tôi chỉ đọc về DT [newDT]. Có gì sai ở đây?
newDT <- DT[,mean(y)+v,by=x]
x V1
[1,] a 4.333333
[2,] a 5.333333
[3,] a 6.333333
[4,] b 7.333333
[5,] b 8.333333
[6,] b 9.333333
[7,] c 10.333333
[8,] c 11.333333
[9,] c 12.333333
(đó là bộ nhớ doable khôn ngoan.) Sau đó:
> DT[newDT]
setkey(DT,x)
setkey(newDT,x)
x y v V1
a 1 1 4.333333
a 3 2 4.333333
a 6 3 4.333333
a 1 1 5.333333
a 3 2 5.333333
a 6 3 5.333333
a 1 1 6.333333
a 3 2 6.333333
a 6 3 6.333333
b 1 4 7.333333
b 3 5 7.333333
b 6 6 7.333333
b 1 4 8.333333
b 3 5 8.333333
b 6 6 8.333333
b 1 4 9.333333
b 3 5 9.333333
b 6 6 9.333333
c 1 7 10.333333
c 3 8 10.333333
c 6 9 10.333333
c 1 7 11.333333
c 3 8 11.333333
c 6 9 11.333333
c 1 7 12.333333
c 3 8 12.333333
c 6 9 12.333333
nhưng đó không phải là những gì tôi muốn. Sai lầm ở đây là gì?
+1 Great câu hỏi! –