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中的所有行?
答案 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”存储密钥的所有可能值。据我所知,CJ
与expand.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