Сводные данные по суточным интервалам в R

Мой набор данных состоит из нескольких наблюдений в 3 столбцах (время, цена и объем), а именно:

time                price   volume
2017-11-15 9:35:11  301.1   1.1
2017-11-15 9:35:09  300.9   3.0
2017-11-15 9:35:07  300.8   1.4 
2017-11-15 9:35:06  300.9   0.1
2017-11-15 9:35:01  301.0   0.6

Я хочу начать с сокращения данных на периоды 24 часа, добавления объема для каждого периода 24 часов и получения на момент агрегирования данных.

Я попытался сделать следующее (исходный набор данных в коде называется "mydf"),

##sum the volume over periods of 24h
mydf_volume_24h <- data.frame (volume = tapply (cbind (mydf$volume), list (cut (mydf$time, breaks="24 hours")), sum))

##bind the previous df with the prices for each time label
mydf_24h <- setNames (cbind (rownames (mydf_volume_24h), mydf_volume_24h, row.names = NULL), c("time", "volume"))

mydf <- mydf %>% 
select(-volume)

mydf_24h <- merge (mydf, mydf_volume_24h, by = "time")

Проблема с этим кодом, помимо того (вероятно), что это не лучший / эффективный способ, не возникает, поскольку первая часть кода дает мне сумму объема за период 24 часа, но маркирует каждую сумму временем 23: 00:00, который не всегда существует в моем наборе данных.

Я намеревался сократить периоды в 24 часа, но дать мне (реальное) время наблюдения, которое ближе всего к периоду в 24 часа. Есть какой-либо способ сделать это?


person diego    schedule 15.11.2017    source источник
comment
Это 24-часовой временной интервал, начиная с момента вашего первого наблюдения? Вы предпочитаете, чтобы 24 часа были календарными днями? Непонятно, что вы хотите делать со своей переменной price. Было бы намного проще, если бы вы могли включить еще несколько строк и идеальный результат для вас.   -  person AntoniosK    schedule 15.11.2017


Ответы (1)


Возможно, это не совсем то, что вы хотите, но из вашего описания я понял, что вы хотите суммировать объем для каждого уникального дня, а также получить максимальное время для каждого уникального дня. Если это действительно то, что вы хотите, то ниже должно работать, чтобы получить ваш совокупный фрейм данных:

library(dplyr)
library(stringr)
library(lubridate)

df <- tibble(time = c(
             "2017-11-15 9:35:11",
             "2017-11-15 9:35:09",
             "2017-11-15 9:35:07",
             "2017-11-15 9:35:06",
             "2017-11-15 9:35:01",
             "2017-11-16 9:36:12",
             "2017-11-16 9:35:09",
             "2017-11-16 9:35:07",
             "2017-11-16 9:35:06",
             "2017-11-16 9:35:01"
             ),
             price = c(301.1, 300.9, 300.8, 300.9, 301.0,
                       302, 303, 304, 305, 306),
             volume = c(1.1, 3.0, 1.4, 0.1, 0.6,
                        1.4, 3.4, 1.5, 0.5, 0.6)
)

df %>% mutate(time = ymd_hms(time)) %>% 
        mutate(day = str_extract(time, "^\\S+"))  %>% 
        group_by(day) %>% 
        summarize(volume = sum(volume), maxTime = max(time))
person TBT8    schedule 15.11.2017