2014-05-20 115 views
0

你好,我正在尋找解決以下問題清潔/最快的方法:加權平均行加入

我的設置是這樣的

library(data.table) 
set.seed(1234) 
DT1 <- data.table(replicate(12,runif(5))) 
setnames(DT1,LETTERS[1:12]) 
DT1[,time:=100] 
DT2 <- data.table(time=rep(100,12), grp=rep(c("X","Y","Z"),each=4), 
    sub=LETTERS[1:12], weight=sample(1:100,12)) 

options(digits=2) 
DT1 
    A  B C D E  F G H I J  K L time 
1: 0.11 0.6403 0.69 0.84 0.32 0.811 0.46 0.76 0.55 0.50 0.074 0.50 100 
2: 0.62 0.0095 0.54 0.29 0.30 0.526 0.27 0.20 0.65 0.68 0.310 0.49 100 
3: 0.61 0.2326 0.28 0.27 0.16 0.915 0.30 0.26 0.31 0.48 0.717 0.75 100 
4: 0.62 0.6661 0.92 0.19 0.04 0.831 0.51 0.99 0.62 0.24 0.505 0.17 100 
5: 0.86 0.5143 0.29 0.23 0.22 0.046 0.18 0.81 0.33 0.77 0.153 0.85 100 

> DT2 
    time grp sub weight 
1: 100 X A  87 
2: 100 X B  5 
3: 100 X C  32 
4: 100 X D  2 
5: 100 Y E  23 
6: 100 Y F  68 
7: 100 Y G  29 
8: 100 Y H  48 
9: 100 Z I  99 
10: 100 Z J  52 
11: 100 Z K  11 
12: 100 Z L  80 

我想計算的加權平均(每行)DT1的列,通過參考組DT2的子類&權重,而每個時間點加入。

E.g.所以DT1然後得到列X,Y & Z綁定到它,所以在這種情況下,第一行的列X是87 * 0.11 + 5 * 0.64 + 32 * 0.69 + 2 * 0.84 /(87 + 5 + 32 + 2 )

有數以百萬DT1行的不同時間點,所以內存可能是雖然

任何建議,將不勝感激的一個限制因素!

回答

0

像這樣的東西可能:

library(reshape2) 

setkey(DT2, time, sub) 

DT2[melt(DT1, id.var = 'time')[, row := 1:.N, by = list(time, variable)]][, 
    sum(weight * value)/sum(weight), by = list(time, grp, row)] 
# time grp row V1 
# 1: 100 X 1 0.29 
# 2: 100 X 2 0.57 
# 3: 100 X 3 0.51 
# 4: 100 X 4 0.69 
# 5: 100 X 5 0.69 
# 6: 100 Y 1 0.67 
# 7: 100 Y 2 0.36 
# 8: 100 Y 3 0.52 
# 9: 100 Y 4 0.71 
#10: 100 Y 5 0.31 
#11: 100 Z 1 0.50 
#12: 100 Z 2 0.59 
#13: 100 Z 3 0.51 
#14: 100 Z 4 0.39 
#15: 100 Z 5 0.59 

您也可以重塑以上的結果,如果你喜歡:

# assuming you called the above table "res" 
dcast.data.table(res, row + time ~ grp) 
#Using 'V1' as value column. Use 'value.var' to override 
# row time X Y Z 
#1: 1 100 0.29 0.67 0.50 
#2: 2 100 0.57 0.36 0.59 
#3: 3 100 0.51 0.52 0.51 
#4: 4 100 0.69 0.71 0.39 
#5: 5 100 0.69 0.31 0.59 
+0

完美,非常感謝!好奇這個DT [,...] [,...]技術是否分別處理每行使用data.table優化,或者使用data.frame一樣快? – user3657159

+0

@ user3657159上述表達式不適用於data.frames,並且base中的類似操作將會慢得多 – eddi