2017-12-14 6 views
2

私は、多数の列を持つ非常に大きなデータセットを持っています。私はこのデータを集約し、各列のセットごとに異なる機能を実行する必要があります。私は多くの列を持っているので、集計の各列で使用する各関数を手動で指定するのは面倒です。私はdata.tableと集計する方法について多くの記事を読んだことがありますが、この状況を処理するものはありません。Data.tableを使用して大きなデータテーブルに異なる数式を持つ複数の列を集計するr

mpgデータセットで作業をします。私はcyltransで集計したいと思います。 ctyhwyの列の平均値を返しますが、最初の値をmanufacturermodelから戻したいとします。実際には、cols<-names(data)[10:50].SDcols=colsを指定して、もっと多くの列に適用します。私は別々に列の各セットを処理し、その後、データをマージすることができますが、これはあなたが数十の異なる列グループを持っているときに乱雑になります。私はdata.tableでよりよい方法が必要であると信じています。

require("data.table") 
require("ggplot2") #for the mpg dataset 
dat1<-data.table(mpg) 
perf<-dat1[, lapply(.SD, ave), .SDcols=c("cty","hwy"), by=list(cyl,trans)] #Aggregate performance data. 
info<-dat1[, lapply(.SD, first), .SDcols=c("manufacturer","model"), by=list(cyl,trans)] #Aggregate model data. 
perf[info, on=list(cyl,trans)] #Merge data 

> head(perf[info, on=list(cyl,trans)]) 
    cyl  trans cty hwy manufacturer model 
1: 4 auto(l5) 6 6   audi a4 
2: 4 manual(m5) 33 33   audi a4 
3: 4 manual(m6) 7 7   audi a4 
4: 4 auto(av) 2 2   audi a4 
5: 6 auto(l5) 16 16   audi a4 
6: 6 manual(m5) 18 18   audi a4 

私は1回の操作で上記を実行することができますどのように質問

?私が考えているのは、各グループをサブセット化し、次にこのようなことをすることです。たぶん少し控えめすぎるかもしれませんが、私は私が推測する星のためだけに射撃しています。

dat1[, .(names(group1)=lapply(group1, ave),names(group2)=lapply(group2, first)), by=list(cyl,trans)] 

答えて

4
group1 = c("cty", "hwy") 
group2 = c("manufacturer", "model") 

dat1[, c(
    lapply(.SD[, ..group1], mean), 
    lapply(.SD[, ..group2], first) 
), by=.(cyl, trans)] 

Rで平均を取るための関数が `mean`、` ave`ないので、私はOPは異なる結果を持って

cyl  trans  cty  hwy manufacturer    model 
1: 4 auto(l5) 20.33333 31.00000   audi     a4 
2: 4 manual(m5) 21.54545 29.27273   audi     a4 
3: 4 manual(m6) 21.00000 29.57143   audi     a4 
4: 4 auto(av) 22.00000 30.50000   audi     a4 
5: 6 auto(l5) 15.18750 21.43750   audi     a4 
6: 6 manual(m5) 16.66667 22.66667   audi     a4 
7: 6 auto(av) 18.66667 26.00000   audi     a4 
8: 4 auto(s6) 20.50000 28.25000   audi   a4 quattro 
9: 6 auto(s6) 17.40000 26.00000   audi   a4 quattro 
10: 6 manual(m6) 16.00000 22.60000   audi   a4 quattro 
11: 8 auto(s6) 13.60000 20.40000   audi   a6 quattro 
12: 8 auto(l4) 12.20000 16.73333 chevrolet c1500 suburban 2wd 
13: 8 manual(m6) 13.42857 20.00000 chevrolet   corvette 
14: 4 auto(l4) 20.50000 27.62500 chevrolet    malibu 
15: 6 auto(l4) 16.03448 22.68966 chevrolet    malibu 
16: 4 auto(l3) 21.00000 27.00000  dodge  caravan 2wd 
17: 6 auto(l6) 16.00000 23.00000  dodge  caravan 2wd 
18: 8 auto(l5) 12.29412 16.41176  dodge dakota pickup 4wd 
19: 8 manual(m5) 13.00000 18.80000  dodge dakota pickup 4wd 
20: 8 auto(l6) 12.50000 18.50000   ford  expedition 2wd 
21: 8 auto(s5) 12.00000 18.00000  nissan  pathfinder 4wd 
22: 8 auto(s4) 16.00000 25.00000  pontiac   grand prix 
23: 4 auto(s4) 20.00000 26.00000  subaru  impreza awd 
24: 4 auto(s5) 22.00000 31.00000  toyota  camry solara 
25: 6 auto(s5) 18.00000 27.00000  toyota  camry solara 
26: 5 auto(s6) 20.50000 29.00000 volkswagen    jetta 
27: 5 manual(m5) 20.50000 28.50000 volkswagen    jetta 
    cyl  trans  cty  hwy manufacturer    model 
+0

を与えます。 – Frank

+1

すばらしい答え。 「ave」の修正をお寄せいただき、ありがとうございました。これはワークフローをExcelと混合するためのものです。 – CCurtis

関連する問題