2017-11-02 8 views
1

ID 1,2および3とVALUE列を持つdata.tableがあるとします。統計を計算したいサブセットを定義するこれらのIDの順列のリストもあります。例えば。グループ化変数のリストに対する列の集約

library(data.table) 
DT <- data.table(ID = c(1,1,2,2,3,3),VALUE = c(1,2,10,20,100,200)) 
permutations <- list(c(1,2),c(2,3),c(1,3)) 

がどのように生成することができ、所望の出力

permutation MEAN 
    1  8.25 
    2  82.5 
    3  75.75 

:{1,2}、{2、3}、{1、3}に三つのグループのIDの値の平均値を計算しますループまたはapplyのない私の擬似コードは次のようになりますが、もちろんそれは動作しません:

DT[,.(MEAN = mean(VALUE)),by = .(ID %in% permutations)] 

それがループまたはコールせずに適用することを行うことは可能ですか?私のテーブルにはとても長い時間がかかります。基地Rアプローチはなり

+3

[=に、スタック(setNames(順列、seq_along(順列)))。(ID =値)] 'DTを試し[。(平均=平均(値))=によって(順列= ind)] ' – akrun

+0

@akrun私はこれが最良の方法であり、投稿する価値があると思います。 – Frank

答えて

1

sapply(permutations, function(i) {x <- DT[DT$ID %in% i]; mean(x$VALUE)}) 
#[1] 8.25 82.50 75.75 
+0

'DT [cond]'はベースでは動作しません。効率的な方法は 'mean(DT $ VALUE [cond])'でしょう。 – Frank

1

我々は「data.frame」にITOを変換して「置換」と「data.table」に参加した後、グループを行う操作を行うことができmean

DT[stack(setNames(permutations, seq_along(permutations))), 
    on = .(ID = values)][, .(MEAN = mean(VALUE)), by = .(permutation = ind)] 
# permutation MEAN 
#1:   1 8.25 
#2:   2 82.50 
#3:   3 75.75 
関連する問題