Frequencies-and-Map-Data-from-GTFS

Tom Buckley

2018-08-05

library(tidytransit)
library(dplyr)

Calculate Headways

Import Data

We’ll use NYC MTA subway data to demonstrate headway calculations, pulling directly from their URL.

A copy of these data are cached in the package for convenience and testing.

If you want to pull the file directly from the url you can also use:

Headway Statistics along a Route

List the routes with the shortest median headways.

route_frequency_summary <- route_frequency(NYC) %>%
  arrange(median_headways)

fast_routes <- filter(route_frequency_summary, median_headways<25)

knitr::kable(head(fast_routes))
route_id median_headways mean_headways st_dev_headways stop_count
GS 4 4 0.01 4
L 4 4 0.13 48
1 5 5 0.14 76
7 5 5 0.29 44
6 6 7 2.84 76
E 6 23 53.01 48

Stop Headway Statistics

List the stops with the shortest headways in the system.

stop_frequency_summary <- stop_frequency(NYC, by_route=FALSE) %>%
  inner_join(NYC$stops_df, by="stop_id") %>%
    select(stop_name, direction_id, stop_id, headway) %>%
      arrange(headway)

head(stop_frequency_summary)
## # A tibble: 6 x 4
## # Groups:   direction_id, stop_id [6]
##   stop_name             direction_id stop_id headway
##   <chr>                        <int> <chr>     <dbl>
## 1 Times Sq - 42 St                 0 902N       3.60
## 2 Grand Central - 42 St            1 901S       3.60
## 3 Times Sq - 42 St                 1 902S       3.60
## 4 Grand Central - 42 St            0 901N       3.61
## 5 Mets - Willets Point             0 702N       3.72
## 6 Junction Blvd                    0 707N       3.72

Map Data

We can add map data to the feed by joining the shapes together around routes.

Lets see whats in the feed.

print(names(NYC))
##  [1] "agency_df"         "calendar_dates_df" "calendar_df"      
##  [4] "routes_df"         "shapes_df"         "stop_times_df"    
##  [7] "stops_df"          "transfers_df"      "trips_df"         
## [10] "validation"

Now lets turn the routes and stops tables in simple features data frames:

NYC <- gtfs_as_sf(NYC)

These are the routes and stops tables with simple features/geometries.

print(names(NYC))
##  [1] "agency_df"         "calendar_dates_df" "calendar_df"      
##  [4] "routes_df"         "shapes_df"         "stop_times_df"    
##  [7] "stops_df"          "transfers_df"      "trips_df"         
## [10] "validation"        "sf_stops"          "sf_routes"

Note that now there are two new tables in the data:

Map Route Frequencies

Now we can join these frequencies to route geometries and plot them with base R.

routes_headways_sf <- right_join(NYC$sf_routes,fast_routes, by="route_id")
routes_headways_sf_vars_only <- select(routes_headways_sf,-route_id)

plot(routes_headways_sf_vars_only)