2015-11-03 2 views
1

Мне нужно создать последовательность значений (называемую «seq» в фрейме данных ниже) на основе хронологического объекта (здесь даты). Чтобы построить новую последовательность, временной интервал между двумя датами должен быть строго больше 1 часа.Создать последовательность значений на основе хронологического объекта

Ниже приведен пример

ID date     seq 
A  2010-04-14 02:00:12 1 
A  2010-04-14 02:00:12 1 
A  2010-04-14 03:00:10 1 
A  2010-04-14 03:00:10 1 
A  2010-04-14 04:00:15 1 
A  2010-04-14 04:00:15 1 
A  2010-04-14 08:00:10 2 
A  2010-04-14 08:00:10 2 
B  2010-04-14 03:00:18 3 
B  2010-04-14 03:00:18 3 
B  2010-04-14 04:00:10 3 
B  2010-04-14 04:00:10 3 
B  2010-04-14 10:00:14 4 
B  2010-04-14 10:00:14 4 
B  2010-04-14 11:00:10 4 
B  2010-04-14 11:00:10 4 

данных

tab <- data.frame(ID= rep(c("A","B"), each=8), date= as.POSIXct(c('2010-04-14 02:00:12','2010-04-14 02:00:12','2010-04-14 03:00:10', '2010-04-14 03:00:10','2010-04-14 04:00:15','2010-04-14 04:00:15','2010-04-14 08:00:10','2010-04-14 08:00:10','2010-04-14 03:00:18','2010-04-14 03:00:18','2010-04-14 04:00:10','2010-04-14 04:00:10','2010-04-14 10:00:14','2010-04-14 10:00:14','2010-04-14 11:00:10','2010-04-14 11:00:10'), format='%Y-%m-%d %H:%M:%S')) 
+0

Что-то вроде '1L + cumsum (diff (tab $ date)> 60 * 60)' – Frank

ответ

1

Ваш желаемый результат кажется неправильным, потому что есть Разница в 1 час между «2010-04-14 03: 00:10 "и" 2010-04-14 04:00:15 ", но ваша последовательность не увеличивается. Из вашего примера также не ясно, должна ли последовательность увеличиваться при изменении ID.

Предполагая seq должна увеличиваться между «2010-04-14 3:00:10» и «2010-04-14 4:00:15», а значение в ID не должно влиять на seq, вот решение:

tab$seq <- c(0, cumsum(abs(diff(tab$date)) > 3600)) + 1 
+0

Большое спасибо Джошуа. Я получил это сообщение об ошибке: «Ошибка в $ <-. Data.frame (* tmp *,« seq », value = c (1, 1, 1, 2, 2, 3,: замена имеет 15 строк, данные имеют – Pierre

+0

@Pierre: Исправлено. –

1

Эта строка кода должна служить цели:

tab$seq <- floor(as.numeric(tab$date-min(tab$date))/3600) 
Смежные вопросы