2016-12-12 9 views
3

私の目標は、頂点が(GTFSのstops.txtからの)頂点であり、エッジが(GTFSのstop_times.txtからの)トリップであるグラフにGTFSの停止とトリップ情報を変換することです。最初のステップは明らかである:GTFSデータからiGraphグラフを作成するR

> library(igraph) 

#Reading in GTFS files 
> stops<-read.csv("stops.txt") 
> stop_times<-read.csv("stop_times.txt") 

私の最初の本能はIGRAPHからgraph_from_data_frame機能を使用するために、単純だったが、重大な欠点がある:DFは本当に必要なスキームに構造化されていませんstop_times。これは、スキームは以下の通りです:私は、実際に(行あたりstart_stop_id、end_stop_id、START_TIME、END_TIMEのない取得したいのですが一方でそれは、それぞれの停留所での到着と出発時間とstop_idsが含まれていることを意味し

>head(stop_times) 
    trip_id stop_id arrival_time departure_time stop_sequence shape_dist_traveled 
1 A895151 F04272  06:20:00  06:20:00   10     0 
2 A895151 F04184  06:22:00  06:22:00   20     648 
3 A895151 F04319  06:24:00  06:24:00   30    1224 
4 A895151 F04369  06:27:00  06:27:00   40    2779 
5 A895151 008264  06:31:00  06:31:00   50    5620 
6 A895151 F01520  06:33:00  06:33:00   60    6691 

"停留所"から "停留所"に変換される)。しかし、この変換はstop_timesの行を繰り返し処理して、同じtrip_idに入っているかどうかを判断する必要があり、そうでない場合はNULLを挿入するか、別の解決策を見つけるために開始エンドデータを計算する必要があるため、これは私のために非常に混乱しています。

これらの2つのデータフレームをすべて目的のグラフに結合する方法はありますか?

答えて

2

'from'と 'to'は、次の行から '現在の'行までの値を 'シフト'することで生成できます。

# get a df with nodes 
    nodes <- dt_stops[, .(stop_id, stop_lon, stop_lat)] 

# links beetween stops 
    links <- dt_stop_times[,.(stop_id, stop_id_to, trip_id)] 

# create graph 
    g <- graph_from_data_frame(links , directed=TRUE, vertices=nodes) 

マインド:そして停止情報は、単に

あなただけにする必要graph_from_data_frame{igraph}使用するように、今、私は例を挙げて説明しましょう、とlibrary(data.table)

## here I"m using Melbourne's GTFS ("http://transitfeeds.com/p/ptv/497/latest/download") 

#dt_stop_times <- lst[[6]]$stop_times 
#dt_stops <- lst[[7]]$stops 

#setDT(dt_stop_times) 
#setDT(dt_stops) 


## join on whatever stop information you want 
dt_stop_times <- dt_stop_times[ dt_stops, on = c("stop_id"), nomatch = 0] 

## set the order of stops for each group (in this case, each group is a trip_id) 
setorder(dt_stop_times, trip_id, stop_sequence) 

## create a new column by shifting the stop_id of the following row up 
dt_stop_times[, stop_id_to := shift(stop_id, type = "lead"), by = .(trip_id)] 

## you will have NAs at this point because the last stop doesn't go anywhere. 

## you can do the same operation on multiple columns at the same time 
dt_stop_times[, `:=`(stop_id_to = shift(stop_id, type = "lead"), 
        arrival_time_stop_to = shift(arrival_time, type = "lead"), 
        departure_time_stop_to = shift(departure_time, type = "lead")), 
       by = .(trip_id)] 

## now you have your 'from' and 'to' columns from which you can make your igraph 

## here's a subset of the result 
dt_stop_times[, .(trip_id, stop_id, stop_name_from = stop_name, arrival_time, stop_id_to, arrival_time_stop_to)] 

#       trip_id stop_id             stop_name_from arrival_time stop_id_to 
# 1:   1.T0.3-86-A-mjp-1.7.R 4174         71-RMIT/Plenty Rd (Bundoora)  25:42:00  4485 
# 2:   1.T0.3-86-A-mjp-1.7.R 4485       70-Janefield Dr/Plenty Rd (Bundoora)  25:43:00  4486 
# 3:   1.T0.3-86-A-mjp-1.7.R 4486        69-Taunton Dr/Plenty Rd (Bundoora)  25:44:00  4487 
# 4:   1.T0.3-86-A-mjp-1.7.R 4487       68-Greenhills Rd/Plenty Rd (Bundoora)  25:45:00  4488 
# 5:   1.T0.3-86-A-mjp-1.7.R 4488      67-Bundoora Square SC/Plenty Rd (Bundoora)  25:46:00  4489 
# ---                               
# 9415793: 9999.UQ.3-19-E-mjp-1.1.H 17871   7-Queen Victoria Market/Elizabeth St (Melbourne City)  23:25:00  17873 
# 9415794: 9999.UQ.3-19-E-mjp-1.1.H 17873  5-Melbourne Central Station/Elizabeth St (Melbourne City)  23:27:00  17875 
# 9415795: 9999.UQ.3-19-E-mjp-1.1.H 17875    3-Bourke Street Mall/Elizabeth St (Melbourne City)  23:30:00  17876 
# 9415796: 9999.UQ.3-19-E-mjp-1.1.H 17876      2-Collins St/Elizabeth St (Melbourne City)  23:31:00  17877 
# 9415797: 9999.UQ.3-19-E-mjp-1.1.H 17877 1-Flinders Street Railway Station/Elizabeth St (Melbourne City)  23:32:00   NA 
#   arrival_time_stop_to 
# 1:     25:43:00 
# 2:     25:44:00 
# 3:     25:45:00 
# 4:     25:46:00 
# 5:     25:47:00 
# ---      
# 9415793:    23:27:00 
# 9415794:    23:30:00 
# 9415795:    23:31:00 
# 9415796:    23:32:00 
# 9415797:     NA 

の使用に参加することができますしかし、GTFS.zipファイルでは、複数の輸送モード(列車、バス、地下鉄など)があり、停車駅のペアの中には、サービス頻度の変動により他のものよりも高い接続性があることがあります。 GTFS.zipからグラフを作成する際に、これら2つの点をどのように考慮すべきかはまだ分かりません。おそらくは、各エッジをその周波数に従って重み付けし、相互依存層として扱われる各トランスポート・モードで共通するいくつかの停止点を持つ多層ネットワークを構築することが前提です。

関連する問題