【发布时间】:2015-10-08 18:18:09
【问题描述】:
我有以下数据,其中每一行对应于某次旅行的家庭成员。 由于我们谈论的是家庭成员,因此这些行可能有重叠的时间,如 第 1 行和第 2 行。行程的持续时间以分钟为单位。 IDX 只是一个索引,用于使转换可追溯。
IDX | ID | Trip | StartDateTime | Duration (in minutes)
1 | 1 | 1 | 2015-01-21 13:00 | 100
2 | 1 | 1 | 2015-01-21 13:00 | 184
3 | 1 | 1 | 2015-01-21 10:00 | 91
4 | 1 | 2 | 2015-01-22 13:00 | 30
5 | 2 | 2 | 2015-01-30 23:00 | 100
现在我想将每个 id、trip、day 的数据拆分为每小时数据,如下所示:
IDX | ID | Trip | StartDateTime | Duration (in minutes)
1 | 1 | 1 | 2015-01-21 13:00 | 60
1 | 1 | 1 | 2015-01-21 14:00 | 40
请注意,该组的总时长仍为 100,与第一行类似。二、 IDX 取自第一行。但是对于第 4 排,我们没有超过 60 分钟,所以 那一个不会被分裂。结果:
IDX | ID | Trip | StartDateTime | Duration (in minutes)
4 | 1 | 2 | 2015-01-22 13:00 | 25
现在最难的问题变成了第五排,那一个实际上是穿越一天! 这样一来就变成了:
IDX | ID | Trip | StartDateTime | Duration (in minutes)
5 | 2 | 2 | 2015-01-30 23:00 | 60
5 | 2 | 2 | 2015-01-31 0:00 | 40
这样的表格可以展开吗?
构建表格的代码:
library(data.table)
data.table(IDX = c(1:5),
ID = c(1,1,1,2,2),
Trip = c(1,1,1,1,2),
StartDateTime = strptime(c("2015-01-21 13:00","2015-01-21 13:00","2015-01-21 10:00","2015-01-22 13:00","2015-01-30 23:00"), format="%Y-%m-%d %H:%M"),
Duration = c(100,184,91,30,100)
)
更新 开始时间可以是 13:12 之类的任何时间,但我对确切的开始时间并不感兴趣,所以实际上是每小时。
所以如果开始时间不等于整小时,比如这样:
IDX | ID | Trip | StartDateTime | Duration (in minutes)
6 | 3 | 1 | 2015-01-30 23:14 | 67
然后我们得到:
IDX | ID | Trip | StartDateTime | Duration (in minutes)
6 | 3 | 1 | 2015-01-30 23:00 | 46
6 | 3 | 1 | 2015-01-31 0:00 | 11
很抱歉没有澄清这部分,但我认为这是 eddi 解决方案的简单后处理步骤。
谢谢
【问题讨论】:
-
您的代码最后会引发警告,仅供参考。也许它有什么不对劲。此外,您在所需输出的一部分中创建了一个
Day列,但它不会出现在接下来的两个中。 -
哦,对不起,这是不一致的!我已经修好了。此外,错误仅仅是因为 data.table 以另一种格式保存日期时间:)。
-
开始时间总是整点吗?
-
不,很遗憾没有。它们是准确的。
标签: r data.table