Объединение данных о времени и дате с соответствующими значениями

#r #merge

#r #объединение

Вопрос:

Я надеюсь, что кто-нибудь сможет мне с этим помочь. Ниже приведен пример данных, над которыми я работаю:

 > print(sampleinput)
                Time ACTIVITY_X ACTIVITY_Y ACTIVITY_Z
 1: 6/19/18 10:40:00         60         74         95
 2: 6/19/18 10:41:20         62         63         88
 3: 6/19/18 10:42:40         60         56         82
 4: 6/19/18 10:44:00         66         61         90
 5: 6/19/18 10:45:20         60         53         80
 6: 6/19/18 10:46:40         57         40         70
 7: 6/19/18 10:48:00         54         41         68
 8: 6/19/18 10:49:20         52         49         71
 9: 6/19/18 10:50:40         61         49         78
10: 6/19/18 10:52:00         93         32         98
11: 6/19/18 10:53:20         80         54         97
12: 6/19/18 10:54:40         73         39         83
13: 6/19/18 10:56:00         47         37         60
14: 6/19/18 10:57:20         51         55         75
15: 6/19/18 10:58:40         51         60         79
16: 6/19/18 11:00:00         14         13         19
17: 6/19/18 11:01:20          0          0          0
18: 6/19/18 11:02:40         13          3         13
19: 6/19/18 11:04:00         20         10         22
20: 6/19/18 11:05:20         13          6         14
  

Ниже приведен пример того, как я хотел бы преобразовать мои данные:

 > print(sampleoutput)
               Time ACTIVITY_X ACTIVITY_Y ACTIVITY_Z
1: 6/19/18 10:40:00          0          0          0
2: 6/19/18 10:44:00        188        180        260
3: 6/19/18 10:48:00        171        134        218
4: 6/19/18 10:52:00        206        130        247
5: 6/19/18 10:56:00        200        130        240
6: 6/19/18 11:00:00        116        128        173
7: 6/19/18 11:04:00         33         13         35
  

Как вы можете видеть в столбце Time , измерения даты и времени производились каждые 80 секунд с соответствующими значениями для столбцов ACTIVITY_X , ACTIITY_Y и ACTIVITY_Z .

Я хотел бы преобразовать свой набор данных таким образом, чтобы вместо того, чтобы измерять дату и время каждые 80 секунд, они у меня были каждые 240 секунд (4 минуты).

Что касается значений в столбцах ACTIVITY_X , ACTIITY_Y и ACTIVITY_Z , это означало бы суммирование их каждые три строки в одну строку. Обратите внимание, что для каждого времени связанные с ним меры ACTIVITY_X , ACTIITY_Y и ACTIVITY_Z вычисляются из интервала, соответствующего: [предыдущее время 1 секунда к фактическому времени].

Пример: Для второй строки со временем 6/19/18 10:41:20 значения для ACTIVITY_X , ACTIITY_Y и ACTIVITY_Z соответствуют интервалу выборки [19.06.18 10:40:01 по 19.06.18 10:41:20].

В первой строке выходной таблицы будет 0 для ACTIVITY_X , ACTIITY_Y и ACTIVITY_Z значений, поскольку я пропускаю значения из двух предыдущих временных интервалов, но это не проблема.

Я довольно новичок в R, и хотя я смог преобразовать свои данные с помощью Excel, я хотел бы автоматизировать этот процесс, который кажется довольно сложным.

Надеюсь, что это интересный вопрос и приветствуется любой вклад!

PS: Я не могу использовать dput из-за слишком большого набора данных, но я загрузил его здесь

Ответ №1:

lubridate должна быть необходимая функциональность.

Похоже, вы data.table уже используете, поэтому используйте это здесь…

     X <- data.table(sampleinput)

    X$Time <- as.POSIXct(X$Time, format = '%m/%d/%y %H:%M:%S')

    X$tgroup <- lubridate::ceiling_date(X$Time, '4 mins')

    X[, list( x = sum(ACTIVITY_X), 
              y = sum(ACTIVITY_Y), 
              z =sum(ACTIVITY_Z) ), by = list (tgroup)]
  

ВОЗВРАТ

                 tgroup   x   y   z
1: 2018-06-19 10:40:00  60  74  95
2: 2018-06-19 10:44:00 188 180 260
3: 2018-06-19 10:48:00 171 134 218
4: 2018-06-19 10:52:00 206 130 247
5: 2018-06-19 10:56:00 200 130 240
6: 2018-06-19 11:00:00 116 128 173
7: 2018-06-19 11:04:00  33  13  35
8: 2018-06-19 11:08:00  13   6  14
  

При необходимости вы могли бы изменить граничный регистр (первая строка) вручную

Комментарии:

1. Я следовал вашему коду, но получаю следующие ошибки: > X <- data.table(sampleinput) > X$tgroup <- lubridate::ceiling_date(X$Time, '4 mins') Error in UseMethod("reclass_date", orig) : no applicable method for 'reclass_date' applied to an object of class "character" In addition: Warning message: All formats failed to parse. No formats found. > X[, list( x = sum(ACTIVITY_X), y = sum(ACTIVITY_Y), z =sum(ACTIVITY_Z) ), by = list (tgroup)] Error in eval(bysub, x, parent.frame()) : object 'tgroup' not found Есть идеи, как это исправить?

2. При этом использовался весь набор данных. Я загрузил это в свой оригинальный пост, если это поможет!

3. Похоже, вам нужно преобразовать столбец X $ Time в соответствующий класс date-time (например, POSIXct ). Я отредактировал ответ выше