2016-03-23 40 views
0

所有現有的組合我有一個data.table out這樣的(實際上它是大得多):data.table:薩姆通過在表

out <-  code weights group 
     1: 2 0.387  1 
     2: 1 0.399  1 
     3: 2 1.610  1 
     4: 3 1.323  2 
     5: 2 0.373  2            
     6: 1 0.212  2 
     7: 3 0.316  3 
     8: 2 0.569  3 
     9: 1 0.120  3 
     10: 1 0.354  3 

它有3個基團與不同的代碼(第1欄) 。在組#1中,代碼3不出現,而在另一個出現。

然後,我想總結每個組和代碼組合的權重。我用這個命令做到這一點:

sum.dt <- out[,.(sum(weights)), by=list(code,group)][order(-V1)] 

這種運作良好,但它不具有組合組1碼3,因爲它不是在out表。我想在sum.dt中有所有可能的組合,並且如果源表中沒有發生組合,它應該總計爲0,這意味着該行中的列V1應該爲0。

任何想法,我怎麼能實現這一點?

+0

'setkey的(出,代碼組)'; 'CJ(code,group,unique = TRUE)] [,lapply(.SD,sum),by =。(code,group)] [order(group,-weights)]' – Jaap

+0

已將此作爲答覆 – Jaap

+0

你也可以根據你想要做什麼找到有用的數組結構。 'xtabs(權重〜組+代碼,出)' –

回答

4

使用CJ(交叉連接),你可以添加缺少的組合:

library(data.table) 
setkey(out, code, group) 
out[CJ(code,group,unique=TRUE) 
    ][, lapply(.SD, sum), by=.(code,group) 
     ][is.na(weights), weights := 0] 

給出:

code group weights 
1: 1  1 0.399 
2: 1  2 0.212 
3: 1  3 0.474 
4: 2  1 1.997 
5: 2  2 0.373 
6: 2  3 0.569 
7: 3  1 0.000 
8: 3  2 1.323 
9: 3  3 0.316 

或用xtabs作爲@alexis_laz在評論中發現:

xtabs(weights ~ group + code, out) 

這給:

 code 
group  1  2  3 
    1 0.399 1.997 0.000 
    2 0.212 0.373 1.323 
    3 0.474 0.569 0.316 

如果你想在一個長格式數據幀此輸出,您可以在reshape2(或data.table)封裝的melt功能包裹xtabs代碼:

library(reshape2) 
res <- melt(xtabs(weights ~ group + code, out)) 

這給:

> class(res) 
[1] "data.frame" 
> res 
    group code value 
1  1 1 0.399 
2  2 1 0.212 
3  3 1 0.474 
4  1 2 1.997 
5  2 2 0.373 
6  3 2 0.569 
7  1 3 0.000 
8  2 3 1.323 
9  3 3 0.316 

你也可以用dplyr組合做tidyr

library(dplyr) 
library(tidyr) 
out %>% 
    complete(code, group, fill = list(weights=0)) %>% 
    group_by(code, group) %>% 
    summarise(sum(weights))