2016-03-24 5 views
2

У меня есть DataTable «D» и я в настоящее время Подменю, как это:быстрее Подменю из data.table

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, ] 
+0

Я избавился от $, и все равно было такое же время – user3022875

+0

Почему вы его подмножили? Просто взглянуть на результат? – Frank

+0

@ Давид, что значит «вам не нужны все эти звонки». Мне нужно подмножество на этих столбцах. Забудьте о $, потому что это не улучшает производительность. Я использую system.time для проверки скорости. – user3022875

ответ

0

Предполагая, что общий подход вы выложили то, что вы хотите сделать, вы можете получить улучшение скорости, приковав к & условиям, а не иметь их все в один звонок до [.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 

Примечание: логически это не будет работать с или | условиях.

Смежные вопросы