2016-12-02 9 views
0

j内の.SDを使用してlapplyの結果をさらに出力する列をj.と組み合わせたいのですが、同じデータテーブルでどうすればいいですか? これまでのところ、2つのデータテーブル(example_summary1, example_summary2)を作成してマージしましたが、より良い方法が必要ですか? たぶん私は完全にこれはあなたが.SDcolsを使用している場合、あなたができる最善である.SD/.SDcols.他のj引数とlapplyを組み合わせたRデータテーブル

example <-data.table(id=rep(1:5,3),numbers=rep(1:5,3),sample1=sample(20,15,repla ce=TRUE),sample2=sample(20,15,replace=100)) 

    id numbers sample1 sample2 
1: 1  1  17  18 
2: 2  2  8  1 
3: 3  3  17  12 
4: 4  4  15  2 
5: 5  5  14  18 
6: 1  1  11  14 
7: 2  2  12  12 
8: 3  3  11  7 
9: 4  4  16  13 
10: 5  5  17  1 
11: 1  1  10  3 
12: 2  2  14  15 
13: 3  3  13  3 
14: 4  4  17  6 
15: 5  5  1  5 


example_summary1<-example[,lapply(.SD,mean),by=id,.SDcols=c("sample1","sample2")] 

     > example_summary1 
    id sample1 sample2 
1: 1 12.66667 11.666667 
2: 2 11.33333 9.333333 
3: 3 13.66667 7.333333 
4: 4 16.00000 7.000000 
5: 5 10.66667 8.000000 


example_summary2<-example[,.(example.sum=sum(numbers)),id] 

> example_summary2 
    id example.sum 
1: 1   3 
2: 2   6 
3: 3   9 
4: 4   12 
5: 5   15 
+0

いくつの列がありますか? – Sotos

+0

私の実際のデータには、 '.SDcols'とj出力リストに含める他のいくつかのカラムで扱いたい42個のカラムがあります。 – Cracker

+0

これらの列は、 'SDcols'以外の列と干渉します。これが可能かどうか、私は 'SDcols'しか利用できないのかどうかは分かりません。 – Cracker

答えて

2

の概念を理解していない:

example_summary1 <- example[, c(lapply(.SD, mean), .(example.sum = sum(numbers))), 
          by = id, .SDcols = c("sample1", "sample2", "numbers")][, numbers := NULL][] 

をあなたはそれがありません.SDcolsnumbersが含まれていない場合jで利用可能です。

example_summary1 <- example[, c(lapply(.(sample1 = sample1, sample2 = sample2), mean), 
           .(example.sum = sum(numbers))), 
          by=id] 

をそれとも、列名のベクトルを持っている場合:

.SDcolsがなければ、あなたはこれを行うことができます

cols <- c("sample1","sample2") 
example_summary1 <- example[, c(lapply(mget(cols), mean), 
           .(example.sum = sum(numbers))), 
          by=id] 

しかし、私はあなたが同じdata.table最適化を得ることはありませんと思われます次に。

最後に、data.table結合は非常に速く、私はあなたのアプローチを使用します。

+0

迅速な回答ありがとうございます。私は手ですべてのSDcolsを書きたくないので、後の方がオプションではありません。しかし、最初のものは有望そうです。 私はいつも '.SDcols'は' .SD'だけを妨害すると考えました。この制限は少し直感的ではありません。 – Cracker

+0

'.SD'は、jで使用可能なすべての列のdata.tableです。 – Roland

+0

列名のベクトルを持っている場合、オプションのための私の編集を参照してください。 – Roland

関連する問題