【问题标题】:faster subsetting of data.table更快的data.table子集
【发布时间】:2016-03-24 18:50:23
【问题描述】:

我有一个数据表“d”,我目前正在像这样子集:

   d[d$time >= as.POSIXct("2016-01-01 00:31:13",tz="GMT") & d$category =="b" & num1==8 & num2>=4 & num3 ==7, ]

对数据表的行进行子集化的最快方法是什么?这可以更快吗?

谢谢。

代码如下:

 times= as.POSIXct("2016-01-01",tz="GMT")+seq(1,2000,by = 1)
d =data.table(time= times,  category1 = rep(c("a","b"),1000), num1=rep(c(2,8),1000), num2=rep(c(3,4),1000), num3=rep(c(5,7),1000))
setkey(d,time)#    
d[d$time >= as.POSIXct("2016-01-01 00:31:13",tz="GMT") & d$category =="b" & num1==8 & num2>=4 & num3 ==7, ]

【问题讨论】:

  • 我去掉了$,它仍然是同一时间
  • 你为什么要对它进行子集化?只是为了看看结果?
  • @David 你是什么意思“你不需要所有这些电话”。我需要在这些列上进行子集化。让我们忘记 $ 因为这不会提高性能。我使用 system.time 来测试速度。
  • 好吧,我不知道为什么要使用完全相同的查询重复子集(相同的值被平等测试,相同的日期被不平等测试),所以我猜真正的性能问题将仍然是一个谜我。
  • @Frank 你能看看这个stackoverflow.com/questions/36209734/…

标签: r data.table


【解决方案1】:

假设您制定的一​​般方法是您想要做的,您可以通过链接& 条件而不是在一次调用[.data.table 中将它们全部放在一起来提高速度。 & 条件越多,您获得的改进就越多。

library(data.table)

# Create a big table to play with
set.seed(1987)
n <- 1e7
myDT <- data.table(X = sample(LETTERS, n, replace = TRUE),
                   Y = sample(1:1000, n, replace = TRUE),
                   Z = sample(1:1000, n, replace = TRUE))
myDT # 10 million rows

system.time(myDT[X %in% c("R", "S", "G") & Y <= 30 & Z >= 500]) #0.86s
system.time(myDT[X %in% c("R", "S", "G")][Y <= 30][Z >= 500]) #0.19s

注意:从逻辑上讲,这不适用于 or | 条件。

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 2013-07-03
    • 1970-01-01
    • 2011-09-29
    • 2014-09-11
    • 1970-01-01
    • 2013-01-08
    • 2012-12-08
    • 2011-07-26
    相关资源
    最近更新 更多