Преобразование данных в миллисекундах в ежедневные данные путем объединения соответствующих значений - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно агрегировать данные временной метки от миллисекунд до ежедневных ..

выборочные данные:

System_ID  n_iter  value      Timestamp
1  xXXXXXXXxx    1      511 2010-05-01 03:29:37.21
2  xXXXXXXXxx    2      513 2010-05-01 03:52:07.56
3  xXXXXXXXxx    3      234 2010-05-01 05:13:54.24
4  xXXXXXXXxx    4      112 2010-05-01 05:41:37.42
5  xXXXXXXXxx    5      173 2010-05-01 06:53:19.01
6  xXXXXXXXxx    6      112 2010-05-01 07:02:53.62
7  xXXXXXXXxx    7      232 2010-05-01 07:35:33.86
8  xXXXXXXXxx    8      776 2010-05-01 07:50:08.14
9  xXXXXXXXxx    9      887 2010-05-01 08:32:55.5
10 xXXXXXXXxx    10     332 2010-05-01 08:56:44.96
11 xXXXXXXXxx    11     778 2010-05-01 09:17:22.57
12 xXXXXXXXxx    12     998 2010-05-01 10:16:26.57
13 xXXXXXXXxx    13     300 2010-05-02 03:33:40.4
14 xXXXXXXXxx    14     400 2010-05-02 03:58:26.44
15 xXXXXXXXxx    15     400 2010-05-02 04:00:23.98

Мне нужно агрегировать данные, которые есть в миллисекундах, до ежедневных в R. Выводдолжен выглядеть ниже:

System_ID  n_iter  value             Timestamp
xxxxxxxx    12    471.5 (Avg)         2010-05-01

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вот решение:

  • Сначала преобразуйте Timestamp в формат POSIXct (который здесь не нужен) и создайте столбец day.

    # convert Timestamp to POSIXct
    df$Timestamp <- as.POSIXct(df$Timestamp, format = "%Y-%m-%d %H:%M:%OS")
    # create a "day" column
    df$day <- format(df$Timestamp, "%Y-%m-%d")
    
  • Затем мы извлекаем циклы ежедневных агрегатов, используя vapply (здесь существует много других возможностей)

    # retireve the required daily data
    t(vapply(seq_along(unique(df$day)), 
            function (k) c(unique(df$System_ID[df$day == unique(df$day)[k]]),    
                           max(df$n_iter[df$day == unique(df$day)[k]]),
                           mean(df$value[df$day == unique(df$day)[k]]),
                           unique(df$day)[k]),
            character(4)))
    
  • Наконец, вотрезультат

         [,1]         [,2] [,3]               [,4]        
    [1,] "xXXXXXXXxx" "12" "471.666666666667" "2010-05-01"
    [2,] "xXXXXXXXxx" "15" "366.666666666667" "2010-05-02"
    

Обратите внимание, что возвращается матрица character, так как функция в vapply возвращает вектор (т. е. должен быть один class).Чтобы столбцы 2 и 3 результата были равны numeric, либо примените as.numeric, либо измените функцию в vapply.


Конечно, вышеизложенное предполагает:

  1. Существует только один System_ID (минимум на день) и
  2. Желаемый n_iterзначение его ежедневное max.

Имейте в виду, что, поскольку vapply может делать ставки достаточно эффективно и удобно, оно также может быть жестким.

0 голосов
/ 12 декабря 2018

Я предполагаю, что вы можете прочитать столбец Timestamp в R data.frame как минимум как символ (в зависимости от того, как вы читаете данные, возможно, будет лучше).В такой настройке вы можете получить пример вывода, используя пакет dplyr.

df <- data.frame(
  System_ID = rep('xXXXXXXXxx', 15)
  , n_iter = seq(1,15)
  , value = c(511, 513, 234, 112, 173, 112, 232, 778, 887, 332, 778, 998, 300, 400, 400)
  , Timestamp = c('2010-05-01 03:29:37.21', '2010-05-01 03:52:07.56', '2010-05-01 05:13:54.24', '2010-05-01 05:41:37.42', '2010-05-01 06:53:19.01', '2010-05-01 07:02:53.62', '2010-05-01 07:35:33.86', '2010-05-01 07:50:08.14', '2010-05-01 08:32:55.5', '2010-05-01 08:56:44.96', '2010-05-01 09:17:22.57', '2010-05-01 10:16:26.57', '2010-05-02 03:33:40.4', '2010-05-02 03:58:26.44', '2010-05-02 04:00:23.98')
) 

df %>%
  dplyr::mutate(
    Timestamp = as.Date(strptime(Timestamp, format = '%Y-%m-%d %H:%M:%OS'))
  ) %>%
  dplyr::group_by(System_ID, Timestamp) %>%
  dplyr::summarise(
    n_iter = max(n_iter)
    , value = mean(value)
  ) %>%
  dplyr::ungroup()
...