使用Data.table r

时间:2017-12-14 21:37:36

标签: r data.table aggregate

我有一个包含许多列的非常大的数据集。我需要聚合这些数据并在每组列上执行不同的功能。我有很多列,因此手动指定要与聚合中的每个列一起使用的每个函数都很麻烦。我已经阅读了许多关于如何与data.table聚合的帖子,但似乎没有人处理这种情况。

示例

允许使用mpg数据集。我希望按cyltrans进行汇总。我想返回ctyhwy列的平均值,但希望返回manufacturermodel中的第一个值。实际上,我会通过指定cols<-names(data)[10:50].SDcols=cols来应用更多列。我可以单独处理每组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)]

1 个答案:

答案 0 :(得分:4)

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

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

给出

    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