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

时间:2015-09-11 18:01:36

标签: r data.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非常大,我想限制在数据表上完成的过滤量。例如,我不愿意这样做: 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
}
````

谢谢!

1 个答案:

答案 0 :(得分:1)

过滤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万行的表,提取ID1==1ID2==3占用大约4.5毫秒的所有行。这不够快吗?