【发布时间】:2013-06-27 10:19:07
【问题描述】:
任何人都可以提出更有效的子集数据框方法而不使用SQL/indexing/data.table 选项吗?
我寻找了类似的问题,this one 建议使用索引选项。
以下是使用时间进行子集化的方法。
#Dummy data
dat <- data.frame(x = runif(1000000, 1, 1000), y=runif(1000000, 1, 1000))
#Subset and time
system.time(x <- dat[dat$x > 500, ])
# user system elapsed
# 0.092 0.000 0.090
system.time(x <- dat[which(dat$x > 500), ])
# user system elapsed
# 0.040 0.032 0.070
system.time(x <- subset(dat, x > 500))
# user system elapsed
# 0.108 0.004 0.109
编辑:
正如罗兰建议的那样,我使用了microbenchmark。看来which 表现最好。
library("ggplot2")
library("microbenchmark")
#Dummy data
dat <- data.frame(x = runif(1000000, 1, 1000), y=runif(1000000, 1, 1000))
#Benchmark
res <- microbenchmark( dat[dat$x > 500, ],
dat[which(dat$x > 500), ],
subset(dat, x > 500))
#plot
autoplot.microbenchmark(res)
【问题讨论】:
-
我很好奇,为什么限制不使用
data.table子集或xts索引? -
这真的取决于具体情况。在您的示例中,通用建议是使
dat成为矩阵并使用它。但是,如果您想要像[.data.frame这样通用且安全的东西,您将找不到更好的东西。 -
@zx8754 如果您提供更多问题的背景信息(我个人不喜欢在没有针对特定工作/流程的时间目标的情况下处理绩效),您会更幸运地得到答案。跨度>
-
@zx8754 只需将其强制为矩阵,您将至少提高 2 倍的性能。data.frame 较慢,因为它是一个多类型容器...
-
@zx8754,如果您觉得自己通过cmets中的建议找到了答案,请将其作为答案发布并接受,以清楚地向其他人表明此问题已得到解答。
标签: performance r dataframe subset