有没有办法在 data.table 中获取与以下 SQL 查询等效的内容?
create C as select * from R,P where
P.x between R.min_x and R.max_x and P.var2 < R.col3
我的问题是我不能计算 R,P
的笛卡尔积,因为 R 会崩溃,我对任何技术都很满意(即使它是分几步...)
典型大小为 R 1K 行,P 3M 行
编辑:
library(data.table)
R = data.table(min_x=c(.6,.4,.01,.8),max_x=c(.7,.51,.05,.95),col3=c(.6,.4,1.2,.6))
P = data.table(x=seq(.1,.9,.1),var2=c(1,.4,.3,.2,0,.5,.65,.7,0))
setkey(P, x)
setkey(R,min_x,max_x) #and max_x is always > min_x
#R
# min_x max_x col3
#1: 0.01 0.05 1.2
#2: 0.40 0.51 0.4
#3: 0.60 0.70 0.6
#4: 0.80 0.95 0.6
#B
# x var2
#1: 0.1 1.00 => var1 not in any [col1,col2]
#2: 0.2 0.40 => same
#3: 0.3 0.30 => same
#4: 0.4 0.20 => .4 in [.4,.51] but .2 < .4 so NO
#5: 0.5 0 => same
#6: 0.6 0.50 => .6 in [.6, .7] but .5 < .6 so NO
#7: 0.7 0.65 => .6 in [.6, .7] AND .65 > .6 => SELECTED
#8: 0.8 0.70 => YES
#9: 0.9 0 => NO
如此预期的结果
# min_x max_x col3 x var2
#1: 0.60 0.70 0.6 0.70 0.65
#2: 0.80 0.95 0.6 0.80 0.70
最佳答案
当此 FR 实现时(及其链接可能有用):
FR#203 Allow 2 column to specify range in i instead of %between%
可能是:
setkey(B, var1, var2)
B[A[,list(.(col1,col2),.(-Inf,col3))], j]
如果这听起来不错?您可能希望指定一个 j
,它将按组(每行 i
)运行,以在内存中保存潜在的笛卡尔展开。但是如果你真的想要返回大表,可以设置 allow.cartesian
标志:
B[A[,list(.(col1,col2),.(-Inf,col3))], allow.cartesian=TRUE]
这当然不能马上完成,所以这只是一个探索性的答案。
关于sql - 等同于带data.table的sql笛卡尔查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644075/