我必须经常子集一个data.frame
的序列(每次运行数百万次)。 data.frame
s近似为200行×30列。根据状态,data.frame
中的值会从一次迭代更改为下一次迭代。因此,在开始时做一个子集是行不通的。有没有办法加快子集的较小的数据。框架
与此相反的问题,when a data.table starts to be faster than a data.frame,我找子集的速度,弥补了data.frame
/data.table
以下最低可重复的例子显示了一个给定的大小,即data.frame
似乎是最快的:
library(data.table)
nmax <- 1e2 # for 1e7 the results look as expected: data.table is really fast!
set.seed(1)
x<-runif(nmax,min=0,max=10)
y<-runif(nmax,min=0,max=10)
DF<-data.frame(x,y)
DT<-data.table(x,y)
summary(microbenchmark::microbenchmark(
setkey(DT,x,y),
times = 10L, unit = "us"))
# expr min lq mean median uq max neval
# 1 setkey(DT, x, y) 70.326 72.606 105.032 80.3985 126.586 212.877 10
summary(microbenchmark::microbenchmark(
DF[DF$x>5, ],
`[.data.frame`(DT,DT$x < 5,),
DT[x>5],
times = 100L, unit = "us"))
# expr min lq mean median uq max neval
# 1 DF[DF$x > 5, ] 41.815 45.426 52.40197 49.9885 57.4010 82.110 100
# 2 `[.data.frame`(DT, DT$x < 5,) 43.716 47.707 58.06979 53.5995 61.2020 147.873 100
# 3 DT[x > 5] 205.273 214.777 233.09221 222.0000 231.6935 900.164 100
有什么我可以做的,以提高性能?输入后
编辑:
- 我运行离散事件仿真和每个事件我有一个列表来搜索(我不介意它是否是一个
data.frame
或data.table
)。最有可能的是,我可以实施一种不同的方法,但是我必须重新编写超过3年开发的代码。目前,这不是一个选项。但如果没有办法让速度更快,这将成为未来的选择。 - 从技术上讲,它不是一个
data.frames
的序列,而是一个data.frame
,它随着每次迭代而变化。但是,这对“如何更快地获得子集”没有影响,我希望现在的问题更全面。
除非您正在对数据进行几乎随机选择,否则您可能想要创建一个您可以参考的现有子集列表,而不是以反复的方式重复使用相同的数据框? –
data.table子集中涉及开销。另请参阅http://stackoverflow.com/a/20179189/1412059 – Roland
您应该询问有关您的实际问题的正确问题。如果你将数据框架子集数百万次,那么你的方法是错误的。 – Roland