【问题标题】:Most efficient way of subsetting dataframes子集数据框的最有效方法
【发布时间】: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


【解决方案1】:

正如 Roland 建议的那样,我使用了 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 2021-02-16
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多