2017-03-06 35 views
2

在R的data.table中,何时应该在%between%%inrange%之间进行子集操作?我已阅读?between的帮助页面,对于这些差异,我仍然摸不着头脑。vs data intable中的in inrange

library(data.table) 
X = data.table(a=1:5, b=6:10, c=c(5:1)) 


> X[b %between% c(7,9)] 
    a b c 
1: 2 7 4 
2: 3 8 3 
3: 4 9 2 
> X[b %inrange% c(7,9)] 
    a b c 
1: 2 7 4 
2: 3 8 3 
3: 4 9 2 

他们对我来说看起来是一样的。有人可以解释为什么存在两种操作?

+1

'X [b%inrange%list(lower = c(6,9),upper = c(7,10))]' - Kristoferson说的例子。 – Frank

+3

比较'X [%%列表(c,b)]'与'X [a%inrange%list(c,b)]''之间的差异,然后再次阅读文档。 –

回答

1
> X 
    a b c 
1: 1 6 5 
2: 2 7 4 
3: 3 8 3 
4: 4 9 2 
5: 5 10 1 

使用评价的例子:

> X[a %between% list(c, b)] 
    a b c 
1: 3 8 3 
2: 4 9 2 
3: 5 10 1 
> X[a %inrange% list(c, b)] 
    a b c 
1: 1 6 5 
2: 2 7 4 
3: 3 8 3 
4: 4 9 2 
5: 5 10 1 

看来between着眼于各行单独地和检查,以查看是否在a的值,以使得C < =一个< = B为行。

inrange会在c最小的标量值,说cminb最大的标量值,bmax,形成了一系列[cmin, bmax],然后检查是否a位于此范围内[cmin, bmax],每一行的a柱。

+0

这是不正确的 - 'inrange'检查一个值是否在所提供的范围的联合中(在上面的示例中,'[cmin,bmax]'恰好是联合,但不一定是这种情况) – sirallen