【发布时间】:2017-12-14 21:37:36
【问题描述】:
我有一个包含许多列的非常大的数据集。我需要汇总这些数据并在每组列上执行不同的功能。我有很多列,因此手动指定要与聚合中的每一列一起使用的每个函数很麻烦。我已经阅读了很多关于如何与data.table 聚合的帖子,但似乎没有一个可以处理这种情况。
示例
让我们使用mpg 数据集。我想通过cyl 和trans 聚合。我想返回cty 和hwy 列的平均值,但想从manufacturer 和model 返回第一个值。实际上,我会通过指定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)]
【问题讨论】:
标签: r data.table aggregate