2017-10-28 20 views
3

私は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つの値に基づいて計算されます。私は何か誤解しているに違いないが、私は何がわからない。

誰か手掛かりがありますか?

答えて

1

参照、(INGのとspread INGとgather)「整頓」のデータについての詳細を知りたい場合は

library(tidyverse) 

wide_df <- 
    spread(your_df,key = stop_sequence, value = departure_time) %>% 
    mutate(timediff = as.numeric(difftime(end,start))) 

(と仮定 " 'route_short_name'、 'trip_id'、および 'direction_id'ごとに 'stop_sequence'を 'start'、 'trip_id'、および 'direction_id'を 'end'に続けて指定します。

'departure_time'を 'route_short_name'、 'trip_id' 'direction_id'の場合は、lastの「departure_time」のdifftimeを取得します「最初の」「departure_timeのの目」

df1 %>% 
    mutate(departure_time = as.POSIXct(departure_time, format = '%H:%M:%S')) %>% 
    group_by(route_short_name, trip_id, direction_id) %>% 
    summarise(duration = as.numeric(difftime(last(departure_time), first(departure_time), unit = 'min'))) 
# A tibble: 5 x 4 
# Groups: route_short_name, trip_id [?] 
# route_short_name      trip_id direction_id duration 
#    <chr>      <chr>  <int> <dbl> 
#1    114 1000.987.0-114-b12-1.86.O   0  27 
#2    33A 1.1598.0-33A-b12-1.451.I   1  42 
#3    39 10000.2877.0-39-b12-1.242.I   1  75 
#4    41C 10.3265.0-41C-b12-1.277.I   1  51 
#5    41C 100.3260.0-41C-b12-1.276.I   1  73 
+1

ありがとう、それは完璧に働きます。私はこれらのlast()関数とfirst()関数を知らなかった! – Ariel

1

これを試してください。今はデータフレームを「長い」形式にしていますが、時差を計算するためには「ワイド」形式にするのが良いでしょう。 tidyverseパッケージのspread機能を使用すると、データが長時間から広範囲に渡ることになります。そこからmutate関数を使用して、新しい列を追加することができます。 as.numeric(difftime(end,start))は、差単位を分単位で保持します。あなたは我々はまた、「ワイド」形式に変換せずにこれを行うことができますthis link to Hadley's book

+0

私は少し間抜け感じ、私は私のお気に入りwiithinの本を持って...とにかく、@akrunのソリューションを働きました。あなたの解決策には起源が必要でした。なぜ起源がhms()で必要なのか分かっていれば、私もそれを理解することがうれしいでしょう:) – Ariel