在data.table包中将join与“or”结合起来

时间:2013-08-09 14:22:44

标签: r data.table

dt <- data.table(X=rnorm(10),a=rep(0:1,length=10),b=rep(0:1,each=5))
dt
             X a b
1:  0.08848742 0 0
2: -1.36578648 1 0
3: -1.01563937 0 0
4:  0.36562936 1 0
5:  2.04250239 0 0
6:  1.33698124 1 1
7: -1.38358719 0 1
8: -0.14395236 1 1
9: -1.36277622 0 1
10:  0.40818281 1 1    

setkey(dt,a,b)
dt[J(1,1),]

这是一种获取a和b均为1的所有行的方法。有没有办法选择a或b为1的那些行?换句话说:除了第1,3和5行之外,获取dt中的所有行?

3 个答案:

答案 0 :(得分:3)

我认为没有直接方式进行OR操作。但是,您可以使用简单的逻辑等效(A OR B) == !(Ac and Bc)来推断您需要的是!J(0, 0)

只是做:

dt[!J(0, 0)]

            X a b
1:  0.7768113 0 1
2:  0.2439950 0 1
3: -0.2095353 1 0
4:  2.9267934 1 0
5: -0.1437019 1 1
6:  1.5120883 1 1
7: -0.4462240 1 1

答案 1 :(得分:3)

我最近一直在做这类事情:

kvals = CJ(a=0:1,b=0:1)
dt[kvals[a|b]]

“kvals”存储密钥的所有可能值。据我所知,CJexpand.grid相同:它会传递传递给它的向量的所有组合。

答案 2 :(得分:1)

为什么不能像普通的i-selection操作那样做呢?

> dt[a==1&b==1,]
            X a b
1: -0.1186037 1 1
2: -0.1166594 1 1
3:  0.2622407 1 1
> dt[a==1|b==1,]
             X a b
1: -0.69037968 0 1
2:  1.63492922 0 1
3: -0.09240386 1 0
4:  0.55300691 1 0
5: -0.11860370 1 1
6: -0.11665936 1 1
7:  0.26224070 1 1