首页 > 解决方案 > 将时间和日期数据与关联值合并

问题描述

我希望有人可以帮助我解决这个问题。以下是我正在处理的数据示例:

> 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

正如您在 column 上看到的那样Time,每 80 秒进行一次日期和时间测量,并为ACTIVITY_XACTIITY_YACTIVITY_Z.

我想以某种方式转换我的数据集,以便不是每 80 秒测量一次日期和时间,而是每 240 秒(4 分钟)测量一次。

至于 columns和中的值ACTIVITY_X,这意味着每三行将它们相加为一行。请注意,对于每个时间,其关联的和度量是根据对应于的时间间隔计算的:[上一时间 + 1 秒到实际时间]。ACTIITY_YACTIVITY_ZACTIVITY_XACTIITY_YACTIVITY_Z

示例:对于第二行,时间6/19/18 10:41:20值为ACTIVITY_XACTIITY_Y并且ACTIVITY_Z对应于采样间隔 [6/19/18 10:40:01 到 6/19/18 10:41:20]。

输出表的第一行将有 0和值ACTIVITY_X,因为我缺少前两个时间间隔的值,但这没问题。ACTIITY_YACTIVITY_Z

我对 R 很陌生,虽然我已经能够用 Excel 转换我的数据,但我想自动化这个看起来很复杂的过程。

希望这是一个有趣的问题,任何意见表示赞赏!

PS:由于数据集太大,我无法使用 dput,但我已经在这里上传了

标签: rmerge

解决方案


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

如有必要,您可以手动更改边界情况(第一行)


推荐阅读