给出一个看起来像这样的数据表
````
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
}
````
谢谢!
答案 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==1
和ID2==3
占用大约4.5毫秒的所有行。这不够快吗?