我有一个包含许多列的非常大的数据集。我需要聚合这些数据并在每组列上执行不同的功能。我有很多列,因此手动指定要与聚合中的每个列一起使用的每个函数都很麻烦。我已经阅读了许多关于如何与data.table
聚合的帖子,但似乎没有人处理这种情况。
示例
允许使用mpg
数据集。我希望按cyl
和trans
进行汇总。我想返回cty
和hwy
列的平均值,但希望返回manufacturer
和model
中的第一个值。实际上,我会通过指定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)]
答案 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