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)
希望这很清楚,谢谢
正如@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"以获取详细信息.