forked from AdamWilsonLabEDU/SpatialDataScience
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCS_09.R
More file actions
106 lines (103 loc) · 4.16 KB
/
CS_09.R
File metadata and controls
106 lines (103 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#' ---
#' title: Tracking Hurricanes!
#' subtitle: Analyze historical storm data from the NOAA API
#' week: 9
#' type: Case Study
#' reading:
#' - Overview of the [International Best Track Archive for Climate Stewardship (IBTrACS)](https://www.ncdc.noaa.gov/ibtracs/index.php?name=ibtracs-data-access)
#' - Performing [Spatial Joins with sf](https://r-spatial.github.io/sf/reference/st_join.html)
#' tasks:
#' - Write a .Rmd script to perform the following tasks
#' - Use an API to access NOAA Storm data over the web
#' - Intersect the storms with US states to quantify how many storms in the database have hit each state.
#' ---
#'
#'
#' # Reading
#'
## ----reading,results='asis',echo=F---------------------------------------
md_bullet(rmarkdown::metadata$reading)
#'
#' # Tasks
#'
## ----tasks,results='asis',echo=F-----------------------------------------
md_bullet(rmarkdown::metadata$tasks)
#'
#' ## Libraries & Data
#'
## ----message=F,warning=FALSE---------------------------------------------
library(sf)
library(tidyverse)
library(ggmap)
library(rnoaa)
library(spData)
data(world)
data(us_states)
#'
#' ## Objective
#'
#' In this case study you will download storm track data from NOAA, make a summary plot, and quantify how many storms have hit each of the United States. This will require you to use a spatial join (`st_join`).
#'
#' ### Your goal
#'
#' Your desired figure looks something like the following:
#'
#'
#' Calculate a table of the five states that have experienced the most storms.
#'
#'
#' <div class="well">
#' <button data-toggle="collapse" class="btn btn-primary btn-sm round" data-target="#demo1">Show Hints</button>
#' <div id="demo1" class="collapse">
#'
#' ## Steps
#'
#' 1. Use the API to Download storm data
#' * Use `storm_shp()` for `basin = "NA"`
#' * Read the points in with `storm_shp_read()`
#' * Convert to `sf` format with `st_as_sf()`
#' 2. Wrangle the data
#' * Filter to storms 1950-present with `filter()`
#' * Use `mutate_if()` to convert `-999.0` to `NA` in all numeric columns with the following command from the `dplyr` package: `mutate_if(is.numeric,` `function(x) ifelse(x==-999.0,NA,x))`
#' * Use the following command to add a column for decade: `mutate(decade=(floor(year/10)*10))`
#' * Use `st_bbox()` to identify the bounding box of the storm data and save this as an object called `region`.
#' 3. Make the first plot
#' * Use `ggplot()` to plot the `world` polygon layer and add the following:
#' * add `facet_wrap(~decade)` to create a panel for each decade
#' * add `stat_bin2d(data=storms,` `aes(y=st_coordinates(storms)[,2],` `x=st_coordinates(storms)[,1]),bins=100)`
#' * use
#' `scale_fill_distiller(palette="YlOrRd",`
#' `trans="log",`
#' `direction=-1,`
#' `breaks = c(1,10,100,1000))` to set the color ramp
#' * use `coord_sf(ylim=region[c(2,4)],`
#' `xlim=region[c(1,3)])` to crop the plot to the region.
#' 4. Calculate table of the five states with most storms.
#' * use `st_transform` to reproject `us_states` to the reference system of the `storms` object (you can extract a CRS from a sf object with `st_crs(storms)`
#' * Perform a spatial join between the storm database and the states object with: `storm_states <- st_join(storms, states, `
#' `join = st_intersects,left = F)`. This will 'add` the state to any storm that was recorded within that state.
#' * Use `group_by(NAME)` to group the next step by US state (beware that there is `NAME` for name of state and `Name` for name of storm. storm_states
#' * use `summarize(storms=length(unique(Name)))` to count how many unique storms occurred in each state.
#' * use `arrange(desc(storms))` to sort by the number of storms in each state
#' * use `slice(1:5)` to keep only the top 5 states
#' ```
#'
#'
#' </div>
#' </div>
#'
#' ---
#'
#' <div class="extraswell">
#' <button data-toggle="collapse" class="btn btn-link" data-target="#extras">
#' Extra time? Try this...
#' </button>
#' <div id="extras" class="collapse">
#'
#'
#' Try to replicate the following graphic using the data you transformed above.
#'
#'
#' Can you sort the rows (states) in order of storm frequency (instead of alphabetical?
#' </div>
#' </div>