【发布时间】:2019-06-04 19:14:13
【问题描述】:
假设我有一个如下的 data.table(您可以将 w 视为一个分组变量):
set.seed(1)
prQ = CJ(Q1 = 1:10, Q2=1:10,w=1:2)
prQ[,pQ:=runif(100,0,1)]
prQ[,pQ:=pQ/sum(pQ),by=w]
> prQ
Q1 Q2 w pQ
1: 1 1 1 0.004889560
2: 1 1 2 0.007553012
3: 1 2 1 0.010549565
4: 1 2 2 0.018433927
5: 1 3 1 0.003714138
---
196: 10 8 2 0.016183006
197: 10 9 1 0.008384253
198: 10 9 2 0.008323492
199: 10 10 1 0.014932841
200: 10 10 2 0.012278353
对于给定的 w,我如何计算一个名为 CDF 的新列,该列执行以下操作:
例如假设Q1 = 4 和Q2 = 6。定义一个新列,
CDF = sum(pQ) 对于所有 Q1Q2
例如单行:
CDF0 = sum(prQ[Q1<=4 & Q2<=6 & w==1,pQ])
prQ[Q1==4 & Q2==6,CDF:=CDF0]
我想对给定 w 的所有行执行此操作。
使用蛮力完成所需的输出:
for(w0 in 1:2){
for(j in 1:10){
for(p in 1:10){
CDF0 = sum(prQ[Q1<=j & Q2<=p & w==w0,pQ])
prQ[Q1==j & Q2==p & w==w0,CDF:=CDF0]
}
}
}
> head(prQ)
Q1 Q2 w pQ CDF
1: 1 1 1 0.004889560 0.004889560
2: 1 1 2 0.007553012 0.007553012
3: 1 2 1 0.010549565 0.015439125
4: 1 2 2 0.018433927 0.025986939
5: 1 3 1 0.003714138 0.019153263
6: 1 3 2 0.018234648 0.044221587
【问题讨论】:
-
@PoGibas - 我认为它比这更复杂 - 我认为它需要是一个自连接,因此所有值小于当前行的行都被求和。跨度>
-
@thelatemail 正确,PoGibas 解决方案不起作用
-
@PoGibas 好的,我现在已经添加了。我使用蛮力方法计算了它。我显然需要比这更有效的东西。 :)
-
保存到新变量时,我无法让它吐出正确的结果,但
prQ[ prQ, on=c("w==w","Q1<=Q1","Q2<=Q2"), sum(pQ), by=.EACHI, allow.cartesian=TRUE ]似乎很接近。 -
@PoGibas 。它现在不适用于后面的行。如果您尝试使用
identical(prQ1, prQ2)比较答案,其中prQ1是用蛮力创建的,prQ2是使用您的代码的答案,它会显示FALSE。
标签: r group-by data.table aggregate cumsum