选择具有特定ID值的数据行的最快方法是什么?

Max*_*cia 0 optimization r dataframe

现在我正在使用分析一些数据

row = dataset[dataset$id == id1,]
Run Code Online (Sandbox Code Playgroud)

row = subset(dataset,id == id1)
Run Code Online (Sandbox Code Playgroud)

其中所有id值都是整数.

但是,在使用更大的数据集时,我的结果令人失望.有什么方法可以加快这项具体任务吗?

akr*_*run 6

使用data.table,我们可以设置一个列,该列通过按递增顺序指定的列对数据进行物理重新排序,这允许我们通过使用二进制搜索进行子集化.

library(data.table)
setkey(setDT(data1), id)[.(id1)]
Run Code Online (Sandbox Code Playgroud)

或者,从data.table版本1.9.4 +,表单的子集DT[x == .]DT[x %in% .]在内部进行优化以自动创建索引,然后使用二进制搜索在连续运行中进行子集,这非常快(参见下面的基准测试).

setDT(data1)[id == id1] # internally optimised to generate index automatically
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请查看此帖子.

数据

 set.seed(24)
 data1 <- data.frame(id= sample(1:6, 25, replace=TRUE), val=rnorm(25))
 id1 <- 5L
Run Code Online (Sandbox Code Playgroud)

PS:setDT()通过引用将data.frame转换为data.table.


基准

set.seed(29)
dat2 <- data.frame(id= sample(1:100, 1e8, replace=TRUE), val=rnorm(1e8))

# data.frame subset in base R
system.time(dat2[dat2$id == id1,])
#   user  system elapsed 
#  6.287   0.646   7.081 

# base R like syntax on data.table; create index and subset using binary search
system.time(setDT(dat2)[id == id1])
#  user  system elapsed 
# 0.646   0.232   0.889 
# successive runs are incredibly fast!
# 0.037   0.002   0.039
# 0.040   0.002   0.042 

# alternatively set key once 
system.time(setkey(setDT(dat2), id))
#  2.908   0.499   3.440 
# and use binary search explicitly
system.time(dat2[.(id1)])
#   user  system elapsed 
#  0.009   0.002   0.012 
Run Code Online (Sandbox Code Playgroud)