2015-04-20 3 views
1

У меня есть следующие данные в таблице истории с именами столбцов, как:Применение функции почасовых данных в R

ID, START_TIME, END_TIME, VALUE 

51,2015-04-17 01:00:00,2015-04-17 01:10:00,98 
51,2015-04-17 01:10:00,2015-04-17 01:20:00,96 
51,2015-04-17 01:20:00,2015-04-17 01:30:00,97 
51,2015-04-17 01:30:00,2015-04-17 01:40:00,99 
51,2015-04-17 01:40:00,2015-04-17 01:50:00,98 
51,2015-04-17 01:50:00,2015-04-17 02:00:00,105 
51,2015-04-17 02:00:00,2015-04-17 02:10:00,103 
51,2015-04-17 02:10:00,2015-04-17 02:20:00,101 
51,2015-04-17 02:20:00,2015-04-17 02:30:00,100 
51,2015-04-17 02:30:00,2015-04-17 02:40:00,104 
51,2015-04-17 02:40:00,2015-04-17 02:50:00,102 
51,2015-04-17 02:50:00,2015-04-17 03:00:00,98 
51,2015-04-17 03:00:00,2015-04-17 03:10:00,97 
51,2015-04-17 03:10:00,2015-04-17 03:20:00,96 
51,2015-04-17 03:20:00,2015-04-17 03:30:00,99 
51,2015-04-17 03:30:00,2015-04-17 03:40:00,100 
51,2015-04-17 03:40:00,2015-04-17 03:50:00,101 
51,2015-04-17 03:50:00,2015-04-17 04:00:00,102 
51,2015-04-17 04:00:00,2015-04-17 04:10:00,99 
51,2015-04-17 04:10:00,2015-04-17 04:20:00,104 
51,2015-04-17 04:20:00,2015-04-17 04:30:00,105 
51,2015-04-17 04:30:00,2015-04-17 04:40:00,103 
51,2015-04-17 04:40:00,2015-04-17 04:50:00,98 
51,2015-04-17 04:50:00,2015-04-17 05:00:00,97 
51,2015-04-17 05:00:00,2015-04-17 05:10:00,101 
51,2015-04-17 05:10:00,2015-04-17 05:20:00,103 
51,2015-04-17 05:20:00,2015-04-17 05:30:00,101 
51,2015-04-17 05:30:00,2015-04-17 05:40:00,105 
51,2015-04-17 05:40:00,2015-04-17 05:50:00,102 
51,2015-04-17 05:50:00,2015-04-17 06:00:00,98 

Я хочу, чтобы применить функцию, как максимум() в колонку VALUE, но с некоторой частотой. Если частота равна 1hour, то для этих данных будет применена функция max для 5 разных наборов.

Ex. С момента начала 2015-04-17 01:00:00 до 2015-04-17 02:00:00 и так далее. Как достичь этого в r. Окончательный результат будет выглядеть так:

51, 2015-04-17 02:00:00, 105 
51, 2015-04-17 03:00:00, 102 
51, 2015-04-17 04:00:00, 104 
51, 2015-04-17 05:00:00, 105 
51, 2015-04-17 06:00:00, 105 

, где вышеуказанные столбцы ID, START_TIME Шифрование до которого не более() вычисляется, значение, которое является результатом макс функции() в течение этого часа. Как сделать это возможным в r. Использование интервалов или что-то еще?

Спасибо ..

ответ

4

Вот еще один способ использования data.table

library(data.table) 
setDT(df)[, .(MAX_VALUE = max(VALUE)), 
      by = .(ID, START_TIME = as.POSIXct(START_TIME, format = "%F %H") + 3600)] 
# ID   START_TIME MAX_VALUE 
# 1: 51 2015-04-17 02:00:00  105 
# 2: 51 2015-04-17 03:00:00  104 
# 3: 51 2015-04-17 04:00:00  102 
# 4: 51 2015-04-17 05:00:00  105 
# 5: 51 2015-04-17 06:00:00  105 

Или подобное решение без каких-либо пакетов зависимостей

df$START_TIME2 <- as.POSIXct(df$START_TIME, format = "%F %H") + 3600 
aggregate(VALUE ~ ID + START_TIME2, df, max) 
# ID   START_TIME2 VALUE 
# 1 51 2015-04-17 02:00:00 105 
# 2 51 2015-04-17 03:00:00 104 
# 3 51 2015-04-17 04:00:00 102 
# 4 51 2015-04-17 05:00:00 105 
# 5 51 2015-04-17 06:00:00 105 
+0

Работает, но что, если частота изменяется от 1 часа до 2 часов? Если бы я заменил 3600 в вышеприведенном ответе на 7200, тогда он не будет работать нормально. –

+0

Я действительно не понимаю ваш желаемый результат. Почему вы хотите добавить один дополнительный час? Почему просто 'as.POSIXct (df $ START_TIME, format ="% F% H ")' недостаточно? –

+1

Поскольку частота будет определена во время выполнения, так что функция max должна применяться для значений 1час или 2 часа. Так. –

1

Вот возможное решение с использованием data.table

library(data.table) 
setDT(df)[, max(VALUE), by = .(START_TIME = sub(":.*", "", START_TIME))] 
    START_TIME V1 
1: 2015-04-17 01 105 
2: 2015-04-17 02 104 
3: 2015-04-17 03 102 
4: 2015-04-17 04 105 
5: 2015-04-17 05 105 
+1

Я редактировал свое решение, так что это будет один лайнер, но вы все еще не выполнить точный желаемый результат. –

3

Вы можете попробовать

library(dplyr) 
HISTORY %>% 
    group_by(ID, TIME = format(START_TIME + 60*60, "%Y-%m-%d %H:00:00")) %>% 
    summarise(MAX_VALUE = max(VALUE)) 
# ID    TIME MAX_VALUE 
# 1 51 2015-04-17 02:00:00  105 
# 2 51 2015-04-17 03:00:00  104 
# 3 51 2015-04-17 04:00:00  102 
# 4 51 2015-04-17 05:00:00  105 
# 5 51 2015-04-17 06:00:00  105 
Смежные вопросы