7

我的问题与具有多个键的 R data.table 有关。举个例子:

library(data.table)
example(data.table)
key(DT)
[1] "x" "y"

并假设我想要“x 不等于 b 和 y 不等于 3”的变体,如下所示:

DT[!J("b",3)]
   x y  v v2  m
1: a 1 42 NA 42
2: a 3 42 NA 42
3: a 6 42 NA 42
4: b 1  4 84  5
5: b 6  6 84  5
6: c 1  7 NA  8
7: c 3  8 NA  8
8: c 6  9 NA  8

我想要的变化是“x 等于 b 和 y 不等于 3”,如下所示:

DT[J("b",!3)]
Error in `[.data.table`(DT, J("b", !3)) : 
  typeof x.y (double) != typeof i.V2 (logical)

有机会告诉 J() 否定某些键吗?谢谢!

4

1 回答 1

7

对于复合键,您可以使用以下

 DT[.("b")][!.(x, 3)]   # x is the name of first column of key

通常,您可以将几个链接在一起[ ] [ ]以过滤到您需要的结果。



请注意,您还可以轻松地在iof中使用逻辑语句data.table
--J()或 now .( )-- 语法只是一种简写的便利。

您几乎可以使用任何会进入if子句的内容,其优势在于可以将列名作为变量进行访问。

在您的具体示例中,您将使用x=="b" & y != 3 note the single &,而不是&&

 DT[  x=="b" & y != 3]

您还可以将矢量扫描与 data.table 的二进制搜索结合起来,如下所示

 DT[.("b")][y != 3]
于 2013-02-24T19:22:26.770 回答