How to use this template

You will see # TASK ///// through out this template. This indicates the beginning of a task. Right below it will be instructions for the task. Each # TASK ///// will be paired with # //TASK ///// to indicate where that specific task ends.

For example, if you need something like below…

What I expect you to do is to replace where it says # **YOUR CODE HERE..** with your answer, like below.

# TASK ////////////////////////////////////////////////////////////////////////
# create a vector with element 1,2,3 and assign it into `my_vec` object
my_vec <- c(1,2,3)
# //TASK //////////////////////////////////////////////////////////////////////

There can be multi-step instructions, like shown below. You may use pipe (%>%) to link multiple functions to perform the task in the instruction. Make sure that you assign the output of your task into an object with the specified name. This is to make sure that your code will run smoothly - if you change the name of the object (i.e., subset_car in the example below), all the subsequent code will NOT run properly.

# TASK ////////////////////////////////////////////////////////////////////////
# 1. Using mtcars object, extract rows where cyl equals 4
# 2. Select mpg and disp columns
# 3. Create a new column 'summation' by adding mpg and disp
# 4. assign it into `subset_car` object
subset_car <- # **YOUR CODE HERE..**
# //TASK //////////////////////////////////////////////////////////////////////
## Error: <text>:8:0: unexpected end of input
## 6: subset_car <- # **YOUR CODE HERE..**
## 7: # //TASK //////////////////////////////////////////////////////////////////////
##   ^

I expect you to replace where it says # **YOUR CODE HERE..** with your answer, like below.

# TASK ////////////////////////////////////////////////////////////////////////
# 1. Using mtcars object, extract rows where cyl equals 4
# 2. Select mpg and disp columns
# 3. Create a new column 'summation' by adding mpg and disp
# 4. assign it into `subset_car` object
subset_car <- mtcars %>% 
  filter(cyl == 4) %>% 
  select(mpg, disp) %>% 
  mutate(summation = mpg + disp)
## Error in mtcars %>% filter(cyl == 4) %>% select(mpg, disp) %>% mutate(summation = mpg + : could not find function "%>%"
# //TASK //////////////////////////////////////////////////////////////////////

You will need to knit it, publish it on Rpubs, and submit the link. If there is any question about this template, do not hesitate to reach out to UJ.

Task description

There are a few main components in this assignment - home location, road networks, transit network, and destination. We will simulate a journey that starts from the starting point (e.g., home), drives to nearest MARTA rail station, transfers to MARTA rail transit, and finally arrives at Midtown station (i.e., an employment center). The following is a list of tasks and data we need for this analysis.

Step 1. Download Required data from GTFS. Convert it to sf format, extract MARTA rail stations, and clean the stop names to delete duplicate names. Also extract the destination station.

Step 2. Download Required data from Census. Convert Census polygons into centroids and subsetting.

Step 3. Download Required data from OSM. Convert it to sfnetwork object and clean the network.

Step 4. Try the simulation for just one home location as a pilot test.

Step 5. Convert the steps we identified in Step 4 into a function so that we can use it to repeat it in a loop.

Step 6. Run a loop to repeat what we did in Step 5 to all other home location using the function from Step 6. Once finished, merge the simulation output back to Census data.

Step 7. Finally, examine whether there is any disparity in using transit to commute to midtown.

Before we start, libraries first..

library(tidyverse)
library(tmap)
library(ggplot2)
library(units)
library(sf)
library(leaflet)
library(tidycensus)
library(leafsync)
library(dbscan)
library(sfnetworks)
library(tigris)
library(tidygraph)
library(plotly)
library(osmdata)
library(here)
library(tidytransit)
library(units)
library(leaflet)
library(tidycensus)
library(leafsync)

epsg <- 4326

Step 1. Download Required data from GTFS.

# TASK ////////////////////////////////////////////////////////////////////////
# Download GTFS data from [here](https://opendata.atlantaregional.com/datasets/marta-gtfs-latest-feed/about) and save it in your hard drive. Read the file using `read_gtfs()` function and assign it in `gtfs` object

gtfs <- read_gtfs(here('/home/rstudio/major2/MARTA_GTFS_Latest_Feed.zip'))
# //TASK //////////////////////////////////////////////////////////////////////



# =========== NO MODIFICATION ZONE STARTS HERE ===============================
# Edit stop_name to append serial numbers (1, 2, etc.) to remove duplicate names
stop_dist <- stop_group_distances(gtfs$stops, by='stop_name') %>%
  filter(dist_max > 200)

gtfs$stops <- gtfs$stops %>% 
  group_by(stop_name) %>% 
  mutate(stop_name = case_when(stop_name %in% stop_dist$stop_name ~ paste0(stop_name, " (", seq(1,n()), ")"),
                               TRUE ~ stop_name))

# Create a transfer table
gtfs$transfers <- gtfsrouter::gtfs_transfer_table(gtfs, 
                                     d_limit = 200, 
                                     min_transfer_time = 120)
## Registered S3 method overwritten by 'gtfsrouter':
##   method       from  
##   summary.gtfs gtfsio
## â–¶ Finding neighbouring services for each stop
## Loading required namespace: pbapply
## ✔ Found neighbouring services for each stop
## â–¶ Expanding to include in-place transfers
## ✔ Expanded to include in-place transfers
# NOTE: Converting to sf format uses stop_lat and stop_lon columns contained in gtfs$stops.
#       In the conversion process, stop_lat and stop_lon are converted into a geometry column, and
#       the output sf object do not have the lat lon column anymore.
#       But many other functions in tidytransit look for stop_lat and stop_lon.
#       So I re-create them using mutate().
gtfs <- gtfs %>% gtfs_as_sf(crs = epsg)

gtfs$stops <- gtfs$stops %>% 
  ungroup() %>% 
  mutate(stop_lat = st_coordinates(.)[,2],
         stop_lon = st_coordinates(.)[,1]) 

# Get stop_id for rails and buses
rail_stops <- gtfs$routes %>% 
  filter(route_type %in% c(1)) %>% 
  inner_join(gtfs$trips, by = "route_id") %>% 
  inner_join(gtfs$stop_times, by = "trip_id") %>% 
  inner_join(gtfs$stops, by = "stop_id") %>% 
  group_by(stop_id) %>% 
  slice(1) %>% 
  pull(stop_id)

# Extract MARTA rail stations
station <- gtfs$stops %>% filter(stop_id %in% rail_stops)

# Extract Midtown Station
midtown <- gtfs$stops %>% filter(stop_id == "134")

# Create a bounding box to which we limit our analysis
bbox <- st_bbox(c(xmin = -84.45241, ymin = 33.72109, xmax = -84.35009, ymax = 33.80101), 
                 crs = st_crs(4326)) %>% 
  st_as_sfc()

# =========== NO MODIFY ZONE ENDS HERE ========================================

Step 2. Download Required data from Census

# TASK ////////////////////////////////////////////////////////////////////////
# Specify Census API key whichever you prefer using census_api_key() function
#census_api_key(" **YOUR CODE HERE..** ")
census_api_key(Sys.getenv("census_api_key"))
## To install your API key for use in future sessions, run this function with `install = TRUE`.
# //TASK //////////////////////////////////////////////////////////////////////



# TASK ////////////////////////////////////////////////////////////////////////
# Using get_acs() function, download Census Tract level data for 2020 for Fulton, DeKalb, and Clayton in GA.
# and assign it into `census` object.
# Make sure you set geometry = TRUE.
# variables to download = c("hhinc" = 'B19013_001',
#                           "r_tot" = "B02001_001",
#                           "r_wh" = "B02001_002",
#                           "r_bl" = "B02001_003",
#                           "tot_hh" = "B25044_001",
#                           "own_novhc" = "B25044_003",
#                           "rent_novhc" = "B25044_010")

census <- # **YOUR CODE HERE..**
  suppressMessages(
  get_acs(geography = "tract", # or "block group", "county", "state" etc. 
          state = "GA",
          county = c("Fulton", "Dekalb","Clayton"),
          variables = c("hhinc" = 'B19013_001',
                           "r_tot" = "B02001_001",
                           "r_wh" = "B02001_002",
                           "r_bl" = "B02001_003",
                           "tot_hh" = "B25044_001",
                           "own_novhc" = "B25044_003",
                           "rent_novhc" = "B25044_010"),
          year = 2020,
          #survey = "acs5", # American Community Survey 5-year estimate
          geometry = TRUE, # returns sf objects
          output = "wide") # wide vs. long
)
## 
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 81 kB     
Downloading: 81 kB     
Downloading: 81 kB     
Downloading: 81 kB     
Downloading: 89 kB     
Downloading: 89 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 320 kB     
Downloading: 320 kB     
Downloading: 320 kB     
Downloading: 320 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 360 kB     
Downloading: 360 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 410 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 440 kB     
Downloading: 440 kB     
Downloading: 440 kB     
Downloading: 440 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 470 kB     
Downloading: 470 kB     
Downloading: 470 kB     
Downloading: 470 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 520 kB     
Downloading: 550 kB     
Downloading: 550 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 560 kB     
Downloading: 570 kB     
Downloading: 570 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 810 kB     
Downloading: 810 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 820 kB     
Downloading: 830 kB     
Downloading: 830 kB     
Downloading: 830 kB     
Downloading: 830 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 870 kB     
Downloading: 890 kB     
Downloading: 890 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 940 kB     
Downloading: 960 kB     
Downloading: 960 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 970 kB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.1 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.2 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.3 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.4 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.5 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.6 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.7 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.8 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 1.9 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.1 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.2 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB     
Downloading: 2.3 MB
save(census, file='census.RData')
# //TASK //////////////////////////////////////////////////////////////////////



# =========== NO MODIFICATION ZONE STARTS HERE ===============================
census <- census %>% 
  st_transform(crs = 4326) %>% 
  separate(col = NAME, into = c("tract", "county", "state"), sep = ", ")

# Convert it to POINT at polygon centroids and extract those that fall into bbox
# and assign it into `home` object
home <- census %>% st_centroid() %>% .[bbox,]
## Warning: st_centroid assumes attributes are constant over geometries
# =========== NO MODIFY ZONE ENDS HERE ========================================

Step 3. Download Required data from OSM.

# TASK ////////////////////////////////////////////////////////////////////////
# 1. Get OSM data using opq() function and bbox object defined in the previous code chunk.
# 2. Specify arguments for add_osm_feature() function using 
#    key = 'highway' and 
#    value = c("motorway", "trunk", "primary", "secondary", "tertiary", "residential", 
#              "motorway_link", "trunk_link", "primary_link", "secondary_link", 
#              "tertiary_link", "residential_link", "unclassified")
# 3. Convert the OSM data into a sf object using osmdata_sf() function
# 4. Convert osmdata polygons into lines using osm_poly2line() function

osm_road <- # **YOUR CODE HERE..**
  opq(bbox = bbox) %>%
  add_osm_feature(key = 'highway', 
                  value = c("motorway","trunk","primary","secondary","tertiary","residential","motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link", "residential_link", "unclassified")) %>%
  osmdata_sf() %>% 
  osm_poly2line()

names(osm_road)
## [1] "bbox"              "overpass_call"     "meta"             
## [4] "osm_points"        "osm_lines"         "osm_polygons"     
## [7] "osm_multilines"    "osm_multipolygons"
# //TASK //////////////////////////////////////////////////////////////////////


# TASK ////////////////////////////////////////////////////////////////////////
# 1. Convert osm_road$osm_lines to sfnetworks using as_sfnetwork() function
# 2. Activate edges
# 3. Clean the network using edge_is_multiple(), edge_is_loop(), to_spatial_subdivision(), to_spatial_smooth()
# 4. Assign the cleaned network to an object named 'osm'


osm <- osm_road$osm_lines %>%
  select(osm_id, highway) %>% 
  sfnetworks::as_sfnetwork(directed = FALSE) %>% 
  activate("edges") %>%
  filter(!edge_is_multiple()) %>%
  filter(!edge_is_loop()) %>% 
  convert(., sfnetworks::to_spatial_subdivision) %>% 
  convert(., sfnetworks::to_spatial_smooth)
## Warning: to_spatial_subdivision assumes attributes are constant over geometries
  # **YOUR CODE HERE..**
  # ...
# //TASK //////////////////////////////////////////////////////////////////////



# TASK ////////////////////////////////////////////////////////////////////////
# Add a new column named 'length' to the edges part of the object `osm`.
osm <- osm %>% 
  # **YOUR CODE HERE..**
  # ...
  mutate(length = edge_length())
# //TASK //////////////////////////////////////////////////////////////////////

Step 4. Try the simulation for just one home location as a pilot test.

# =========== NO MODIFICATION ZONE STARTS HERE ===============================
# Extract the first row from `home` object and store it as `origin`
origin <- home[1,]
# =========== NO MODIFY ZONE ENDS HERE ========================================


# TASK ////////////////////////////////////////////////////////////////////////
# Find a station that is closest to the origin by Euclidean distance
# using st_distance() function.
dist_to_stations <- st_distance(station, origin)
closest_station <- station[which.min(dist_to_stations), ]

save.image('step4_all.RData')

# //TASK //////////////////////////////////////////////////////////////////////


# TASK ////////////////////////////////////////////////////////////////////////
# Find the shortest path from origin to station
# using st_network_paths() function.
paths <- st_network_paths(osm, origin, station)
# //TASK //////////////////////////////////////////////////////////////////////


# =========== NO MODIFICATION ZONE STARTS HERE ===============================
# Calculate the length of edges in the shortest route to the closest MARTA station
closest_dist <- osm %>% 
  activate("nodes") %>% 
  # Slice the part that corresponds with the shortest route
  slice(paths$node_paths[[1]]) %>% 
  # Extract "edges" from the sfnetworks object as a separate sf object
  st_as_sf("edges") %>% 
  # Extract 'length' column and calculate sum
  pull(length) %>% 
  sum()

# If the routing function is not working, assume the route length is 150% of Euclidean distance
if (closest_dist == set_units(0, m)){
  closest_dist <- dist_to_stations[which.min(dist_to_stations)] * 1.5
}

# Calculate how to long it takes to traverse `closest_dist` 
# assuming we drive at 30 miles/hour speed.
# Store the output in `trvt_osm_m`.
car_speed <- set_units(30, mile/h)
trvt_osm_m <- closest_dist/set_units(car_speed, m/min) %>%  # Distance divided by 30 mile/h
  as.vector(.)
# =========== NO MODIFY ZONE ENDS HERE ========================================


# TASK ////////////////////////////////////////////////////////////////////////
# 1. From `osm` object, activate nodes part and
# 2. use `closest_index` to extract the selected path
# paths_closest <- # **YOUR CODE HERE..**
# //TASK //////////////////////////////////////////////////////////////////////


# TASK ////////////////////////////////////////////////////////////////////////
# Use filter_stop_times() function to create a subset of stop_times data table
# for date = 2021-08-14, minimum departure time of 7AM, maximum departure time of 10AM.
# Assign the output to `am_stop_time` object
# am_stop_time <- # **YOUR CODE HERE..**
am_stop_time <- filter_stop_times(gtfs_obj=gtfs, extract_date = "2021-08-14", min_departure_time = 3600*7, max_arrival_time = 3600*10)
# //TASK //////////////////////////////////////////////////////////////////////



# TASK ////////////////////////////////////////////////////////////////////////
# 1. Use travel_times() function to calculate travel times from the `closest_station` 
#    to all other stations during time specified in am_stop_time. 
# 2. Filter the row for which the value of 'to_stop_name' column 
#    equals midtown$stop_name. Assign it into `trvt` object.
trvt <- travel_times(filtered_stop_times = am_stop_time,
                     stop_name = midtown,
                     return_coords = TRUE)
# **YOUR CODE HERE..**
# //TASK //////////////////////////////////////////////////////////////////////



# Divide the calculated travel time by 60 to convert the unit from seconds to minutes.
trvt_gtfs_m <- trvt$travel_time/60

# Add the travel time from home to the nearest station and
# the travel time from the nearest station to Midtown station
total_trvt <- drop_units(trvt_osm_m) + trvt_gtfs_m
# =========== NO MODIFY ZONE ENDS HERE ========================================

Step 5. Converting it into a function & Apply it for the whole study area

# Function definition (do not modify other parts of the code in this code chunk except for those inside the TASK section)

get_trvt <- function(home, osm, station, midtown){
  # Extract the first row from `home` object and store it as `origin`
  origin <- home[1,]
  
  # Find a station that is closest to the origin by Euclidean distance
  dist_to_stations <- st_distance(station, origin)
  closest_station <- station[which.min(dist_to_stations), ]
  
  # Find the shortest path from origin to station
  paths <- st_network_paths(osm, origin, station)
  
  # Calculate the length of edges in the shortest route to the closest MARTA station
  closest_dist <- osm %>% 
    activate("nodes") %>% 
    slice(paths$node_paths[[1]]) %>% 
    st_as_sf("edges") %>% 
    pull(length) %>% 
    sum()
  
  if (closest_dist == set_units(0, m)){
    closest_dist <- dist_to_stations[which.min(dist_to_stations)] * 1.5
  }
  
  car_speed <- set_units(30, mile/h)
  trvt_osm_m <- closest_dist/set_units(car_speed, m/min) %>% as.vector(.)
  
  am_stop_time <- filter_stop_times(gtfs_obj=gtfs, extract_date = "2021-08-14", min_departure_time = 3600*7, max_arrival_time = 3600*10)
  
  trvt <- travel_times(filtered_stop_times = am_stop_time,
                       stop_name = midtown,
                       return_coords = TRUE)
  
  trvt_gtfs_m <- trvt$travel_time/60
  
  total_trvt <- drop_units(trvt_osm_m) + trvt_gtfs_m
  
  # TASK ////////////////////////////////////////
  # If the code in Step 4 runs fine,
  # Replace where it says **YOUR CODE HERE..** below with 
  # the entirety of the code in the previous code chunk (i.e., Step 4)
  
  # **YOUR CODE HERE..**
  
  
  
  # //TASK //////////////////////////////////////

  # =========== NO MODIFICATION ZONE STARTS HERE ===============================
  if (length(total_trvt) == 0) {total_trvt = 0}

  return(total_trvt)
  # =========== NO MODIFY ZONE ENDS HERE ========================================
}

This is the end of the section where you need to code

Step 6 - 7. Run the loop, create a map and plots

Run the code below to generate a thematic map and a plot

Write a short description of the pattern you see in the map and the plot

# Prepare an empty vector
total_trvt <- vector("numeric", nrow(home))

# Apply the function for all Census Tracts
# Fill `total_trvt` object with the calculated time
for (i in 1:nrow(home)){
  total_trvt[i] <- get_trvt(home[i,], osm, station, midtown)
}
## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length

## Warning in total_trvt[i] <- get_trvt(home[i, ], osm, station, midtown): number
## of items to replace is not a multiple of replacement length
# Cbind the calculated travel time back to `home`
home_done <- home %>% 
  cbind(trvt = total_trvt)

# Map!
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(census[census$GEOID %in% home$GEOID,] %>% mutate(pct_white = r_whE/r_totE)) + 
  tm_polygons(col = "pct_white", palette = 'GnBu') + 
  tm_shape(home_done) + 
  tm_dots(col = "trvt", palette = 'Reds', size = 0.1)
  # ggplot!
inc <- ggplot(data = home_done %>% 
         mutate(hhinc = hhincE),
       aes(x = hhinc, y = trvt)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Median Annual Household Income",
       y = "Travel Time from Home to Midtown Station") +
  theme_bw()

wh <- ggplot(data = home_done %>% 
         mutate(pct_white = r_whE/r_totE),
       aes(x = pct_white, y = trvt)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(x = "Percent White",
       y = "Travel Time from Home to Midtown Station") +
  theme_bw()

ggpubr::ggarrange(inc, wh)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## `geom_smooth()` using formula = 'y ~ x'