data.table子表多个条件

时间:2013-11-01 19:25:34

标签: r data.table

我正在使用包数据表,我想知道我在下面使用的矢量扫描的替代方案是什么。

x<-data.table(v1=1:30, v2=sample(c("a", "b"), 30, replace=TRUE),
  v3=sample(1:30, 30, replace=TRUE))

x[(x$v2=="a" & x$v3>10) | (x$v2=="b" & x$v3<20),]

谢谢你,Z

感谢回应:我尝试过它们并没有看到明显的差异。这是额外的尝试:

x<-data.table(v1=1:30000000, v2=sample(c("a", "b"), 30000000, replace=TRUE),
              v3=sample(1:30, 30000000, replace=TRUE))

ptm <- proc.time()
x[(x$v2=="a" & x$v3>10) | (x$v2=="b" & x$v3<20),]
proc.time() - ptm # 4.37

ptm <- proc.time()
x[(v2=="a" & v3>10) | (v2=="b" & v3<20),]
proc.time() - ptm # 4.29


ptm <- proc.time()
rbind(x[(v2=="a" & v3>10)], x[(v2=="b" & v3<20)])
proc.time() - ptm # 5.03

setkey(x, "v2")
ptm <- proc.time()
rbind(x[(v2=="a" & v3>10)], x[(v2=="b" & v3<20)])
proc.time() - ptm # 4.35 (not incl. time of setkey)



setkey(x, "v2")
ptm <- proc.time()
rbindlist(list(x[(v2=="a" & v3>10)], x[(v2=="b" & v3<20)]))
proc.time() - ptm # 3.87 (not incl. time of setkey)


setkey(x, "v2", "v3")
ptm <- proc.time()
dim(x[J(c('a','b'))][(v2 == 'a' & v3 > 10) | (v2 == 'b' & v3 < 20)])
proc.time() - ptm #4.16 (not incl time of setkey)

1 个答案:

答案 0 :(得分:1)

我想知道这是否会更快。可能需要一个更大的测试用例来正确测试,但既然你在问,也许你有一个:

 setkey(x, "v2")
 rbind( x[v2=="a"&v3>10], x[v2=="b"&v3<20] )