我已经在StackOverflow的R部分中进行了一段时间的分区,寻找一个合适的答案,但没有看到什么似乎适用于我的问题。 我有一个这种格式的数据集(我已经调整了它似乎是最简单的方法,但stop_sequence值通常只是每个停止的增量数字):
route_short_name trip_id direction_id departure_time stop_sequence
33A 1.1598.0-33A-b12-1.451.I 1 16:15:00 start
33A 1.1598.0-33A-b12-1.451.I 1 16:57:00 end
41C 10.3265.0-41C-b12-1.277.I 1 08:35:00 start
41C 10.3265.0-41C-b12-1.277.I 1 09:26:00 end
41C 100.3260.0-41C-b12-1.276.I 1 09:40:00 start
41C 100.3260.0-41C-b12-1.276.I 1 10:53:00 end
114 1000.987.0-114-b12-1.86.O 0 21:35:00 start
114 1000.987.0-114-b12-1.86.O 0 22:02:00 end
39 10000.2877.0-39-b12-1.242.I 1 11:15:00 start
39 10000.2877.0-39-b12-1.242.I 1 12:30:00 end
它基本上是一个公共汽车旅行数据集。我想要的只是设法获得每次旅行的持续时间,所以这样的事情:
route_short_name trip_id direction_id duration
33A 1.1598.0-33A-b12-1.451.I 1 42
41C 10.3265.0-41C-b12-1.277.I 1 51
41C 100.3260.0-41C-b12-1.276.I 1 73
114 1000.987.0-114-b12-1.86.O 0 27
39 10000.2877.0-39-b12-1.242.I 1 75
我已经尝试了很多东西,但在任何情况下我都没有设法通过trip_id对数据进行分组,然后每次都处理这两个值。我一定误解了什么,但我不知道是什么。
有没有人有线索?
答案 0 :(得分:1)
试试这个。现在你的数据帧在" long"格式,但将它放在"宽"格式来计算时差。使用spread
包中的tidyverse
功能会将您的数据从长到宽。从那里,您可以使用mutate
功能添加所需的新列。 as.numeric(difftime(end,start))
会将差异单位保持在几分钟内。
library(tidyverse)
wide_df <-
spread(your_df,key = stop_sequence, value = departure_time) %>%
mutate(timediff = as.numeric(difftime(end,start)))
如果您想了解更多关于&#34; tidy&#34;数据(以及spread
和gather
),请参阅this link to Hadley's book
答案 1 :(得分:1)
我们也可以在不转换为“广泛”的情况下执行此操作。格式(假设&#39; stop_sequence&#39;开始&#39;后面跟着&#39;结束&#39;对于每个&#39; route_short_name&#39;,&#39; trip_id&#39; ;和&#39; direction_id&#39;。
转换&#39; departure_time&#39;到日期时间列,按&#39; route_short_name&#39;,&#39; trip_id&#39;和&#39; direction_id&#39;分组,获取docker container ls
&difftime
& #39; DEPARTURE_TIME&#39;与第一个&#39; &#39; DEPARTURE_TIME&#39;
last