R:组合聚合

use*_*382 0 aggregate r data.table

我们可以说有以下内容:

time=c(20060200,20060200,20060200,20060200,20060200,20060300,20060400,20060400,20060400)
bucket=c(1,1,2,2,1,3,3,3,1)
rate=c(0.05,0.04,0.04,0.05,0.06,0.01,0.07,0.08,0.03)




       time bucket rate
1: 20060200      1 0.05
2: 20060200      1 0.04
3: 20060200      2 0.04
4: 20060200      2 0.05
5: 20060200      1 0.06
6: 20060300      3 0.01
7: 20060400      3 0.07
8: 20060400      3 0.08
9: 20060400      1 0.03
Run Code Online (Sandbox Code Playgroud)

我知道如何通过这样的方式将速率汇总到时间或桶

test=data.table(time,bucket,rate)
b=test[,list(x=sum(rate)),by=bucket]
Run Code Online (Sandbox Code Playgroud)

我的问题是如何聚合到桶,同时保持时间不变.
所以我想要的是这样的:

20060200  1  0.15
20060200  2  0.09
20060200  3  0
20060300  1  0
20060300  2  0
20060300  3  0.01 
20060400  1  0.03
20060400  2  0
20060400  3  0.15
Run Code Online (Sandbox Code Playgroud)

希望这很清楚,谢谢

Fra*_*ank 5

正如@Mittenchops所说,你正在寻找笛卡尔积.这有一个功能,CJ.你可以得到你想要的组合unique(CJ(time,bucket)).要在data.table中使用它,您可以(i)设置密钥并(ii)将其与CJ连接:

setkey(test,time,bucket)
b <- test[unique(CJ(time,bucket)),list(x=sum(rate))]
b[is.na(x),x:=0]
Run Code Online (Sandbox Code Playgroud)

最后一步将缺失值设置为0.结果是:

       time bucket    x
1: 20060200      1 0.15
2: 20060200      2 0.09
3: 20060200      3 0.00
4: 20060300      1 0.00
5: 20060300      2 0.00
6: 20060300      3 0.01
7: 20060400      1 0.03
8: 20060400      2 0.00
9: 20060400      3 0.15
Run Code Online (Sandbox Code Playgroud)

顺便说一下,当你使用x[y,...]语法"加入"时(其中x和y都是data.tables),有一个隐藏的by...一个by-without-by ... on(可能只是第一部分)x的密钥.在文档或谷歌上查找"by-without-by"以获取详细信息.