将 data.table 分区为键和记录的哈希映射

Partition data.table into hash map of keys and records

给出的数据 table 看起来像这样

````
KeyCol1 | KeyCol2 | DataCol1 | DataCol2 | DataCol3
--------|---------|----------|----------|---------
  1     |    2    |    a     |   b      |    c
  1     |    2    |    a     |   d      |    f
  1     |    3    |    e     |   h      |    i
  2     |    2    |   abc    |  hij     |   mno
````

有没有什么方法可以在两个键列的函数上生成哈希映射,这两个键列的值将是与键控列匹配的行?例如,如果键控列的函数是 paste(KeyCol1,KeyCol2,sep=","),则哈希映射将为您提供:

````>hash("1,2")
````

````KeyCol1 | KeyCol2 | DataCol1 | DataCol2 | DataCol3
--------|---------|----------|----------|---------
  1     |    2    |    a     |   b      |    c
  1     |    2    |    a     |   d      |    f
````

或者还有其他我没有想到的方法可以做到这一点。我想以这种方式分区的原因是我正在使用的 data.table 非常大,我想限制对数据 table 进行的过滤量。例如,我宁愿不这样做: tbl[KeyCol1==1&KeyCol2==2]tbl[KeyCol1==1&&KeyCol2==3] 分开,而是我希望分区发生一次。现在,我只有一个 for 循环在做:

````filtered<-tbl[KeyCol1==1]
for (i in 2:3) {
    what_i_want<-filtered[KeyCol2==i]
    #do stuff
}
````

谢谢!

过滤 data.tables 非常快。

library(data.table)
set.seed(1)    # for reproducible example
DT <- data.table(ID1 = sample(1:10, 1e7, replace=TRUE),
                 ID2 = sample(1:10, 1e7, replace=TRUE),
                 x   = rnorm(1e7),
                 y   = rpois(1e7, lambda=25))

setkey(DT, ID1, ID2)
library(microbenchmark)

microbenchmark(DT[J(1,3)], times=10)  # extract all rows where ID1==1 and ID2==3
# Unit: milliseconds
#         expr      min       lq     mean   median       uq      max neval
#  DT[J(1, 3)] 4.383809 4.473238 4.526363 4.488933 4.563852 4.783576    10

因此,对于包含 1000 万行的 table,提取 ID1==1ID2==3 中的所有行大约需要 4.5 毫秒。是不是不够快??