如何将data.table按多列分组?


71

我正在使用该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")]

但没有运气。

有什么建议?


1
data.table您使用的是哪个版本?我相当确定版本1.8.2允许您将列名称的字符向量传递给by参数。
BenBarnes 2012年

3
究竟。(非常旧的)data.table版本,或者存在其他错误。 ?data.table说:“ by-一个未加引号的列名,一个列名表达式的list(),一个包含用逗号分隔的列名的单个字符串或列名的字符向量。” 因此c("adShown","url")应该没问题,或"adShown,url"list(adShown,url)
Matt Dowle 2012年

@BenBarnes:不错,我仍然回到1.8。
screechOwl

Answers:


93

使用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

7
但是也by=c("adShown","url")应该没问题。还是+1。
Matt Dowle 2012年

9
是否有可能只是显示了汇总YZ并且Mean列,就像aggregate作品?
卡洛2014年

3
据我所知,list您不需要像使用vector一样引用名称c(),这很有趣。
PatrickT

1
因此,当您按Y和Z分组时,它在DT中应该只出现一次。例如,当Y = 0,Z = 5和Mean = 7.40时,您应该只有一行。但是,您的DT中有五个。我在这里想念什么吗?
Muhsin Zahid Ugur

3
@PatrickT感谢您的提示!使用此技巧,您还可以按表达式分组,这非常方便。
random_forest_fanatic

5

要添加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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.