【问题标题】:How to group data.table by multiple columns?如何按多列对 data.table 进行分组?
【发布时间】:2012-09-10 19:56:57
【问题描述】:

我正在使用data.table 包来加快对数据集的一些汇总统计收集。

我很好奇是否有一种方法可以按多个列进行分组。我的数据如下所示:

  purchaseAmt        adShown        url
   15.54            00001         150000001
    4.82            00002         150000001
  157.99            05005         776300044
   ...               ...            ...

我可以这样做:

adShownMedian <- df1[,median(purchaseAmt),by="adShown"]

获取每个广告的中位数。我将如何做结合adShownurl 的事情?

我试过了:

adShownMedian <- df1[,median(purchaseAmt),by=c("adShown","url")]

但没有运气。

有什么建议吗?

【问题讨论】:

  • 您使用的是哪个版本的data.table?我相当肯定版本 1.8.2 允许您将列名的字符向量传递给 by 参数。
  • 没错。要么是(非常)旧版本的 data.table,要么存在其他错误。 ?data.table 说:“by - 单个不带引号的列名、列名表达式的 list()、包含逗号分隔的列名的单个字符串或列名的字符向量。”所以c("adShown","url") 应该没问题,或者"adShown,url",或者list(adShown,url)
  • @BenBarnes:很好,我仍然回到 1.8。

标签: r group-by data.table


【解决方案1】:

要添加 Jilber Urbina 答案,并解决 kahlo 评论:
如果您想为每个 Y - Z 组合获取单行以及您可以执行的聚合值

DT[, .(X=mean(X)), by=list(Y, Z)]

这和做的一样

DT[, .(X=mean(X)), by=.(Y, Z)] 
# or
DT[, .(X=mean(X)), by=c('Y','Z')]
# or specify column names in vector
names = c('Y','Z')
DT[, .(X=mean(X)), by=names] 

(data.table 版本 1.12.6)

【讨论】:

    【解决方案2】:

    使用by=list(adShown,url) 而不是by=c("adShown","url")

    例子:

    set.seed(007) 
    DF <- data.frame(X=1:20, Y=sample(c(0,1), 20, TRUE), Z=sample(0:5, 20, TRUE))
    
    library(data.table)
    DT <- data.table(DF)
    DT[, Mean:=mean(X), by=list(Y, Z)]
    
    
         X Y Z      Mean
     1:  1 1 3  1.000000
     2:  2 0 1  9.333333
     3:  3 0 5  7.400000
     4:  4 0 5  7.400000
     5:  5 0 5  7.400000
     6:  6 1 0  6.000000
     7:  7 0 3  7.000000
     8:  8 1 2 12.500000
     9:  9 0 5  7.400000
    10: 10 0 2 15.000000
    11: 11 0 4 14.500000
    12: 12 0 1  9.333333
    13: 13 1 1 13.000000
    14: 14 0 1  9.333333
    15: 15 0 2 15.000000
    16: 16 0 5  7.400000
    17: 17 1 2 12.500000
    18: 18 0 4 14.500000
    19: 19 1 5 19.000000
    20: 20 0 2 15.000000
    

    【讨论】:

    • 但是by=c("adShown","url") 也应该没问题。无论如何 +1。
    • 是否可以像aggregate 一样只显示聚合的YZMean 列?
    • 据我所知,list 不需要像使用向量 c() 那样引用名称,这很有趣。
    • @PatrickT 感谢您的提示!有了这个技巧,你还可以按表达式分组,非常方便。
    • 也由=.(adShown,url)
    猜你喜欢
    • 2018-07-10
    • 2012-11-13
    • 2016-06-13
    • 2017-08-11
    • 1970-01-01
    • 2017-08-10
    • 2021-09-26
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多