如何按多列对data.table进行分组?

scr*_*Owl 61 group-by r data.table

我正在使用该data.table软件包来加速数据集上的一些摘要统计收集.

我很好奇是否有一种方法可以按多列分组.我的数据如下:

  purchaseAmt        adShown        url
   15.54            00001         150000001
    4.82            00002         150000001
  157.99            05005         776300044
   ...               ...            ...
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

adShownMedian <- df1[,median(purchaseAmt),by="adShown"]
Run Code Online (Sandbox Code Playgroud)

获得每个广告的中位数.我怎么会做一些结合adShownurl

我试过这个:

adShownMedian <- df1[,median(purchaseAmt),by=c("adShown","url")]
Run Code Online (Sandbox Code Playgroud)

但没有运气.

有什么建议?

Jil*_*ina 83

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
Run Code Online (Sandbox Code Playgroud)

  • 是否可以只显示聚合的"Y","Z"和"Mean"列,就像`aggregate`一样? (9认同)
  • 但是`by = c("adShown","url")`也应该没问题.+1无论如何. (5认同)
  • 据我所知,使用``list``你不需要引用名字,就像你对矢量``c()``一样,这很有意思. (2认同)
  • @PatrickT感谢您的提示!通过这个技巧,您还可以按表达式进行分组,这非常方便. (2认同)
  • 也由=.(adShown,url) (2认同)

小智 5

要添加 Jilber Urbina 答案,并解决 kahlo 评论:
如果您想为每个 Y-Z 组合获得一行,并且可以使用聚合值

DT[, .(X=mean(X)), by=list(Y, Z)]
Run Code Online (Sandbox Code Playgroud)

这和做一样

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] 
Run Code Online (Sandbox Code Playgroud)

(数据表版本 1.12.6)