首页 > 解决方案 > 优化 data.table 中的矢量扫描

问题描述

我有这样一个问题,我需要将 2 列子集数百万次。因此,我希望优化子设置的时间。

我看到即使矢量扫描是按照 data.table 插图https://cran.r-project.org/web/packages/data.table/vignettes/datatable-keys-fast-subset.html一个矢量扫描

自动优化为使用二分搜索

按照键控子集的意图,显式写入仍然更快。

library(data.table)

flights <- fread("flights14.txt") # From the "Introduction to data.table Vignette"

setkey(flights, origin, dest)




system.time({for(i in 1:5000) flights[.("JFK", "MIA")]})

system.time({for(i in 1:5000) flights[origin == "JFK" & dest == "MIA"]})

system.time({for(i in 1:5000) flights[origin %chin% "JFK" & dest %chin% "MIA"]})
  user  system elapsed 
268.689   5.203   8.767 

  user  system elapsed 
200.481   6.370   6.489

   user  system elapsed 
261.194   3.981   8.518 

我的想法是重写以下代码,使其优化(我的搜索向量中的元素数量是可变的)。

flights[origin %chin% c("JFK", "EWR") & dest %chin% c("MIA", "ALB",)]

尝试尽可能多地使用第一个键的一种方法较慢:

rbind(flights[.(c("JFK", "EWR"), "ALB"), nomatch = NULL], flights[.(c("JFK", "EWR"), "MIA"), nomatch = NULL])

有没有办法更快地完成这个子集?

标签: rdata.table

解决方案


推荐阅读