【问题标题】:Aggregate Multiple Columns with Different Formula in large data.tables using Data.table r使用 Data.table r 在大型 data.tables 中聚合具有不同公式的多列
【发布时间】:2017-12-14 21:37:36
【问题描述】:

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

示例

让我们使用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)]

【问题讨论】:

    标签: r data.table aggregate


    【解决方案1】:
    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
    

    【讨论】:

    • 我从 OP 得到不同的结果,因为在 r 中取平均值的函数是 mean,而不是 ave
    • 很棒的答案。感谢ave 的更正,这就是我将工作流与 excel 混合得到的结果。
    猜你喜欢
    • 2019-10-15
    • 2020-03-29
    • 2015-11-01
    • 2021-03-22
    • 2020-01-30
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多