数据帧行之间的时差

时间:2017-10-28 00:28:43

标签: r

我已经在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对数据进行分组,然后每次都处理这两个值。我一定误解了什么,但我不知道是什么。

有没有人有线索?

2 个答案:

答案 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;数据(以及spreadgather),请参阅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 lsdifftime& #39; DEPARTURE_TIME&#39;与第一个&#39; &#39; DEPARTURE_TIME&#39;

last