2
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 的那些行?换句话说:获取 dt 中除第 1,3 和 5 行之外的所有行?

4

3 回答 3

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
于 2013-08-09T14:27:29.440 回答
3

我最近一直在做这样的事情:

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

“kvals”存储键的所有可能值。据我所知,它CJ与 相同:它采用传递给它的向量的所有组合。expand.grid

于 2013-08-09T15:18:05.837 回答
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
于 2013-08-09T15:50:59.347 回答