2017-03-20 9 views
1

大きなデータセット、複数の異なるタイプのデータが列にマージされる場所、列名の一部のデータを「整理」しようとしています。これはa common scenario in biological datasetです。複数の列でdata.tableをグループ化するときに出力に列を保持する方法

私のデータテーブルには、平均値に崩壊したい反復測定値があります。データを整然としたフォーマットに変換すると、これらのレプリケート値は追加の行になります。私はいくつかの列で/グループを集約し、反復試験の平均値を計算しようとした場合:

collapsed.data <- tidy.dt[, mean(expression, na.rm = T), by=list(Sequence.window,Gene.names,ratio,enrichment.type,condition)] 

を私はby文で使用される唯一の列があり、列V1などmean(expression)と続く結果テーブルを取得します。それ以外の(変更されていない)列もすべて取得できますか?

次のように私が達成しようとしているものを示したミニマリストの例は次のとおりです。

library(data.table) 
dt <- data.table(a = c("a", "a", "b", "b", "c", "a", "c", "a"), b = rnorm(8), 
       c = c(1,1,1,1,1,2,1,2), d = rep('x', 8), e = rep('test', 8)) 
dt[, mean(b), by = list(a, c)] 
# a c   V1 
#1: a 1 -0.7597186 
#2: b 1 -0.3001626 
#3: c 1 -0.6893773 
#4: a 2 -0.1589146 

あなたが列deを見ることができるように削除されます。

+0

あなたもそれらを要約する必要があります。 – Sotos

+0

これは、data.tableがどのファイルをどのディレクトリに格納するかを知ることができないため、 'dt [、(head、d、1)、head(e、1) 'd'と' e'の値を取得したいとします。つまり、 'a'と' b'の組み合わせごとに 'd'と' e'に複数の値を設定できます。あなたが返すものについて具体的にする必要があります –

+0

通常、私は 'by'引数に保存したい列を追加します。 – BenBarnes

答えて

3

一つの可能​​性は、グループ内deを含めることです:あなたは、あなたがより多くのプログラム的な方法でこれを行うことができますaggregrateしたいものを除くすべて列を維持したい場合は

res <- dt[, mean(b), by = list(a, c, d, e)] 
res 
# a c d e   V1 
#1: a 1 x test 0.9271986 
#2: b 1 x test -0.3161799 
#3: c 1 x test 1.3709635 
#4: a 2 x test 0.1543337 

cols_to_group_by <- setdiff(colnames(dt), "b") 
res <- dt[, mean(b), by = cols_to_group_by] 

結果は上記と同じです。

これにより、行数が削減されました。あなたはすべての行を保持したい場合は、追加の列を追加することができます。

ここ
dt[, mean_b := mean(b), by = list(a, c)] 
dt 
# a   b c d e  mean_b 
#1: a 1.1127632 1 x test 0.9271986 
#2: a 0.7416341 1 x test 0.9271986 
#3: b 0.9040880 1 x test -0.3161799 
#4: b -1.5364479 1 x test -0.3161799 
#5: c 1.9846982 1 x test 1.3709635 
#6: a 0.2615139 2 x test 0.1543337 
#7: c 0.7572287 1 x test 1.3709635 
#8: a 0.0471535 2 x test 0.1543337 

dtは、すなわち参照によってに変更された大規模なデータに時間を節約するかもしれないdtの全てを、コピーせずに。

関連する問題