2015-09-19 5 views
0

У меня есть dataframe с колонкой фактора:Добавить последовательность DateTime для каждого уровня фактора

s<- data.frame(id = 901:910) 
s$id<-as.factor(s$id) 

и у меня есть последовательность DateTime:

library(lubridate) 
start <- now()+as.difftime(2,units="hours") 
t <- seq(from = start, length.out = 60, by = "mins") 

я хотел бы добавить последовательность t в качестве столбца в s для каждого уровня s$id.

+1

Возможно, 'expand.grid (id = s $ id, time = t)' – akrun

ответ

3

В качестве альтернативы expand.grid(id = s$id, time = t), вы можете также использовать CJ (Cross Join) из data.table пакета:

CJ(s$id,t) 

, который дает:

 V1     V2 
    1: 901 2015-09-19 14:52:23 
    2: 901 2015-09-19 14:53:23 
    3: 901 2015-09-19 14:54:23 
    4: 901 2015-09-19 14:55:23 
    5: 901 2015-09-19 14:56:23 
---       
596: 910 2015-09-19 15:47:23 
597: 910 2015-09-19 15:48:23 
598: 910 2015-09-19 15:49:23 
599: 910 2015-09-19 15:50:23 
600: 910 2015-09-19 15:51:23 

Если вы хотите добавить, что s , вы можете выполнить следующую операцию соединения:

s <- setDT(s, key="id")[CJ(s$id,t)] 

, которая дает:

> s 
     id     V2 
    1: 901 2015-09-19 15:08:39 
    2: 901 2015-09-19 15:09:39 
    3: 901 2015-09-19 15:10:39 
    4: 901 2015-09-19 15:11:39 
    5: 901 2015-09-19 15:12:39 
---       
596: 910 2015-09-19 16:03:39 
597: 910 2015-09-19 16:04:39 
598: 910 2015-09-19 16:05:39 
599: 910 2015-09-19 16:06:39 
600: 910 2015-09-19 16:07:39 

Другой вариант заключается в использовании crossing -функции из tidyr:

library(tidyr) 
crossing(id = s$id, time = t) 

, который дает аналогичный результат.

+0

безупречное спасибо, что один из обоих методов более эффективен – Sasukethorpido

+0

@ datashinobi В этом случае базовый R-подход быстрее для кадра данных с меньшим, чем 1000 идентификаторов. Для гораздо больших наборов данных метод 'data.table' работает быстрее. – Jaap

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