2014-11-28 2 views
2

Я имею дело с фреймом данных с 3 миллионами строк и 10 столбцами, и я делаю некоторые подмножества на нем. У меня есть код для игрушек ниже. Когда я подмножество, это занимает много времени. Если я использую data.table и подмножество на data.table, это будет быстрее? Вот некоторые игрушки Код:Подмножество с использованием data.table вместо data.frame

s<-c(100,100,100,800,800,6662,33565,265653262,266532) 
p<-c(5,5,5,10,10,10,8,9,10) 
name<-c("bob","bob","bob","ed","ed","ed","joe","frank","ted") 
time<- as.POSIXct(as.character(c("2014-10-27 18:11:36 PDT","2014-10-27 18:11:37 PDT","2014-10-27 18:11:38 PDT","2014-10-27 18:11:39 PDT","2014-10-27 18:11:40 PDT","2014-10-27 18:11:41 PDT","2014-10-27 19:11:36 PDT","2014-10-27 20:11:36 PDT","2014-10-27 21:11:36 PDT"))) 
dat<- data.frame(s,p,name,time) 
dat 

здесь фрейм данных:

  s p name    time 
1  100 5 bob 2014-10-27 18:11:36 
2  100 5 bob 2014-10-27 18:11:37 
3  100 5 bob 2014-10-27 18:11:38 
4  800 10 ed 2014-10-27 18:11:39 
5  800 10 ed 2014-10-27 18:11:40 
6  6662 10 ed 2014-10-27 18:11:41 
7  33565 8 joe 2014-10-27 19:11:36 
8 265653262 9 frank 2014-10-27 20:11:36 
9 266532 10 ted 2014-10-27 21:11:36 

теперь я Подмножество на dataframe:

result <- subset(dat, as.numeric(s) == 100 
        & p == 5 
        & name == "bob" 
        & time >= "2014-10-27 18:11:36 PDT" 
        & time <= "2014-10-27 18:12:00 PDT" 
        ) 
    result 

    s p name    time 
1 100 5 bob 2014-10-27 18:11:36 
2 100 5 bob 2014-10-27 18:11:37 
3 100 5 bob 2014-10-27 18:11:38 

Как я могу сделать что-то подобное, используя data.table ?

спасибо.

ответ

3

Ну, ваш примерный код действительно разбивается на кадры данных благодаря «селекторам времени» - вы пытаетесь сопоставить даты POSIXlt (в фрейме данных) с символьными строками (в селекторе). Я думаю, что вы хотите:

result <- subset(dat, as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT") 
       ) 

result 
    s p name    time 
1 100 5 bob 2014-10-27 18:11:36 
2 100 5 bob 2014-10-27 18:11:37 
3 100 5 bob 2014-10-27 18:11:38 

Этот синтаксис работает отлично для data.tables:

dat <- as.data.table(dat) 
result <- subset(dat, 
       as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT") 
) 
result 

    s p name    time 
1: 100 5 bob 2014-10-27 18:11:36 
2: 100 5 bob 2014-10-27 18:11:37 
3: 100 5 bob 2014-10-27 18:11:38 

Если вы хотите что-то более data.table типа, вы можете избежать «подмножество» целиком и вместо того, чтобы просто непосредственно работают с данными. таблица:

dat <- as.data.table(dat) 
result <- dat[as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT"),] 

result 

    s p name    time 
1: 100 5 bob 2014-10-27 18:11:36 
2: 100 5 bob 2014-10-27 18:11:37 
3: 100 5 bob 2014-10-27 18:11:38 
+0

это не сломало мой код. если я использую data.table, это будет быстрее, чем использование data.frame? – user3022875

+0

Тогда я не уверен, какую среду вы должны использовать, чтобы проверить, меньше ли временных меток POSIX или больше строк;). Для подмножеств? Контролируйте его и проверьте. Я обычно использую data.table в ситуациях, когда я хочу выполнять подмножество операций с данными для извлечения или синтеза значений - там они намного быстрее. –

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