【问题标题】:Aggregate data by multiple groups按多个组聚合数据
【发布时间】:2016-10-23 01:26:39
【问题描述】:

我的问题最好用一个例子来描述:

数据:

v1 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p")
v2 <- c("aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn","oo","pp")
v3 <- c("aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj","kkk","lll","mmm","nnn","ooo","ppp")
values <- 1:10000
y <- data.frame(var1=sample(v1,size = 100,replace=T),
                var2=sample(v2,size=100,replace=T),
                var3=sample(v3,size=100,replace=T),
                val1=sample(values,size=100,replace=T),
                val2=sample(values,size=100,replace=T))


head(y)
  var1 var2 var3 val1 val2
1    h   hh  lll 4832 9547
2    h   nn  eee  727 6382
3    h   bb  jjj 9985 8041
4    e   bb  jjj 1438  280
5    k   ff  nnn 3094 4316
6    f   cc  kkk 7426 3588

基本上,我需要通过 var1、var2 和 var3 的所有唯一组合对 val1 和 val2 求和。因此,上述head 语句中的所有行都不会被加在一起。

在我处理的实际数据中,var1、var2 和 var3 有数千个不同的值。此外,我想要分组的列数量不同。这将在一个闪亮的应用程序中使用,用户可以选择他/她想要聚合的任意数量的组。我试过使用stats::aggregate,但它似乎不够通用。

如果您需要其他任何东西来帮助回答我的问题,请告诉我。

编辑: 到目前为止非常有用的回复,谢谢你,但它们并不是我想要的(我的错,我没有足够清楚地说明问题)。

问题在于自动化我的脚本,以便它可以聚合上面的示例以及以下示例:

head(y)
  var1 var2 var3 var4 var5 val1 val2 val3
1    p   pp  nnn   ll  aaa 3914 6621 8968
2    d   ii  jjj   pp  aaa 5885  955 7560
3    j   bb  ppp   aa  ccc 7979 5602 4639
4    e   mm  ooo   mm  fff 8746 8612 2212
5    g   ee  aaa   kk  lll 4795 6438 6318
6    f   mm  kkk   ii  ggg 7550   90 1173

在我闪亮的应用程序中,数据可以很容易地看起来像这样,或者具有任意数量的列的其他变体。我知道变量和值列的索引值,但不知道它们的名称。所以我可以使用索引值,但它们正在改变。此外,我不能在任何列中进行硬编码,因为它们总是在变化。

我希望这会有所帮助!

【问题讨论】:

  • aggregate(cbind(val1, val2)~var1+var2+var3, data=y, sum, na.rm=TRUE) 应该可以工作。
  • 你甚至可以在上面的例子中使用cbind("val1"=val1, "val2"=val2)设置列名。

标签: r aggregate grouping


【解决方案1】:
library(data.table)
y<-data.table(y)
setkey(y, var1, var2, var3)

y[,.(sum1 = sum(val1), sum2 = sum(val2)), by = c("var1", "var2", "var3") ]

var1 var2 var3  sum1 sum2
a   cc  ggg  4483 5176
a   gg  ccc  1928 1833
a   mm  ppp  1550 3930
a   nn  kkk  1340 2080
b   dd  ccc  8950  158
b   hh  bbb  4798  689
b   kk  mmm   129 9740
b   pp  ccc  8363 1531
c   gg  ggg  1662  125
c   gg  hhh  4485 3800
...

另一个流行的选项是dplyr

library(dplyr)

y %>% group_by(var1, var2, var3) %>% 
  summarise(sum1 = sum(val1), sum2 =sum(val2))

 var1   var2   var3  sum1  sum2
(fctr) (fctr) (fctr) (int) (int)
    a     cc    ggg  4483  5176
    a     gg    ccc  1928  1833
    a     mm    ppp  1550  3930
    a     nn    kkk  1340  2080
    b     dd    ccc  8950   158
    b     hh    bbb  4798   689
    b     kk    mmm   129  9740
    b     pp    ccc  8363  1531
    c     gg    ggg  1662   125
    c     gg    hhh  4485  3800

有人说dplyr 的语法更容易读/写,但我同样喜欢这两种方法。速度通常是可比的,尽管我相信data.table 对于非常大的数据集具有优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多