Использование пакета lubridate для слияния дат и связанных с ними значений в R - PullRequest
0 голосов
/ 15 марта 2019

Это второй раз, когда я публикую сообщения относительно того же набора данных. На этот раз у меня возникли проблемы с использованием функции ceiling_date из пакета lubridate.

Вот образец моего набора данных:

> head(dataraw)
                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

И вот как я хотел бы преобразовать свои данные:

                Time     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

Где время берется каждые 240 секунд (4 минуты) вместо 80 секунд (1:20 минут), как в dataraw. Значения ACTIVITY_X, ACTIVITY_Y и ACTIVITY_Z суммируются для соответствия более длинному 4-минутному интервалу.

Ниже приведен код, который я использовал для этого вопроса. Это работает для примера, который я выложил, но при использовании полного набора данных dataraw у меня появляются предупреждающие сообщения и ошибки, как показано ниже:

> sampleinput<-na.omit(dataraw)
> names(sampleinput)[1]<-"Time"
> sampleinput$Time <- as.numeric(as.character(sampleinput$Time))
Warning message:
NAs introduced by coercion 
> 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 "c('double', 'numeric')"
> 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

Это относится к синтаксису или ошибкам кодирования? Если это поможет, полный набор данных dataraw доступен здесь , так как он слишком велик, чтобы его можно было разместить как dput()

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 15 марта 2019

Вы были почти там. Разбор даты не удался. Смотрите решение ниже:

library(lubridate)
library(dplyr)

data <- read.table("41361_sensor_converted.txt", sep="\t", header=TRUE)

data %>% 
 mutate(
  Time      = mdy_hms(data$Time),
  TimeGroup = ceiling_date(Time, '4 mins') ) %>%
 group_by(TimeGroup) %>% 
 summarise(
  x = sum(ACTIVITY_X),
  y = sum(ACTIVITY_Y),
  z = sum(ACTIVITY_Z) )
...