将 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==1
和 ID2==3
中的所有行大约需要 4.5 毫秒。是不是不够快??
给出的数据 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==1
和 ID2==3
中的所有行大约需要 4.5 毫秒。是不是不够快??