library(readr)
library(sf)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(spData)
To access larger datasets in this package, install the spDataLarge package with:
`install.packages('spDataLarge', repos='https://nowosad.github.io/drat/',
type='source')`
library(ggplot2)
library(ggthemes)
library(urbnmapr)
Attaching package: ‘urbnmapr’
The following objects are masked _by_ ‘.GlobalEnv’:
counties, states
library(spdep)
library(spatialreg)
Loading required package: Matrix
Attaching package: ‘spatialreg’
The following objects are masked from ‘package:spdep’:
get.ClusterOption, get.coresOption, get.mcOption, get.VerboseOption,
get.ZeroPolicyOption, set.ClusterOption, set.coresOption, set.mcOption,
set.VerboseOption, set.ZeroPolicyOption
library(leaflet)
library(tidyterra)
Attaching package: ‘tidyterra’
The following object is masked from ‘package:stats’:
filter
library(terra)
terra 1.7.71
hate_crimes <- read_csv("~/Documents/DIDA370/NYPD_Hate_Crimes.csv",
col_types = cols(`Full Complaint ID` = col_number(),
`Month Number` = col_integer(), `Record Create Date` = col_date(format = "%m/%d/%Y")))
hc <- read_csv("~/Documents/DIDA370/Hate_Crimes_2010.csv")
Rows: 822 Columns: 44── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): County, Crime Type
dbl (42): Year, Anti-Male, Anti-Female, Anti-Transgender, Anti-Gender Non-Conforming, A...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
setwd("~/Documents/DIDA370/nycnhood_acs")
Warning: The working directory was changed to /Users/evanhaddican/Documents/DIDA370/nycnhood_acs inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
borough_data <- st_read("NYC_Nhood ACS2008_12.shp")
Reading layer `NYC_Nhood ACS2008_12' from data source
`/Users/evanhaddican/Documents/DIDA370/nycnhood_acs/NYC_Nhood ACS2008_12.shp'
using driver `ESRI Shapefile'
Simple feature collection with 195 features and 98 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -74.25559 ymin: 40.49612 xmax: -73.70001 ymax: 40.91553
Geodetic CRS: WGS 84
setwd("~/Documents/DIDA370/Police Precincts")
Warning: The working directory was changed to /Users/evanhaddican/Documents/DIDA370/Police Precincts inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
pp <- st_read("geo_export_a8a956e0-72a9-4f89-85da-a0122a31caac.shp")
Reading layer `geo_export_a8a956e0-72a9-4f89-85da-a0122a31caac' from data source
`/Users/evanhaddican/Documents/DIDA370/Police Precincts/geo_export_a8a956e0-72a9-4f89-85da-a0122a31caac.shp'
using driver `ESRI Shapefile'
Simple feature collection with 77 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -74.25559 ymin: 40.49613 xmax: -73.70001 ymax: 40.91553
Geodetic CRS: WGS84(DD)
hc_pp <- hate_crimes %>%
left_join(pp, by = c("Complaint Precinct Code" = "precinct"))
colnames(hc_pp)[5] <- "Precinct"
hc_pp <- hc_pp %>%
group_by(Precinct) %>%
mutate(Complaint_Count = n()) %>%
#relocate(Complaint_Count)
mutate(Precinct = as.numeric(Precinct)) %>%
select(-c(`Full Complaint ID`, `Offense Category`, `Bias Motive Description`,`Offense Description`, `Patrol Borough Name`, County, `Law Code Category Description`, `PD Code Description`,`Arrest Date`, `Arrest Id`, shape_area, shape_leng,`Complaint Year Number`,`Month Number`,`Record Create Date`))
ggplot()+
geom_sf(data = hc_pp, mapping=aes(fill = Complaint_Count, geometry=geometry)) +
labs(fill = "Complaint Count")+
theme_void()
aaa <- hc_pp %>%
left_join(borough_data, by = c("geometry" = "geometry"))
Error in `left_join()`:
! Can't join `x$geometry` with `y$geometry` due to incompatible types.
ℹ `x$geometry` is a <sfc_GEOMETRY>.
ℹ `y$geometry` is a <sfc_GEOMETRY>.
Backtrace:
1. hc_pp %>% left_join(borough_data, by = c(geometry = "geometry"))
3. dplyr:::left_join.data.frame(., borough_data, by = c(geometry = "geometry"))
ggplot()+
geom_sf(data = full_data, mapping=aes(fill = Complaint_Count, geometry=geometry)) +
labs(fill = "Complaint Count")+
theme_void()
county_data <- read.csv("county_data.csv")
setwd("~/Documents/DIDA370/nycnhood_acs")
Warning: The working directory was changed to /Users/evanhaddican/Documents/DIDA370/nycnhood_acs inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
borough_data <- st_read("NYC_Nhood ACS2008_12.shp")
Reading layer `NYC_Nhood ACS2008_12' from data source
`/Users/evanhaddican/Documents/DIDA370/nycnhood_acs/NYC_Nhood ACS2008_12.shp'
using driver `ESRI Shapefile'
Simple feature collection with 195 features and 98 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -74.25559 ymin: 40.49612 xmax: -73.70001 ymax: 40.91553
Geodetic CRS: WGS 84
county_data <- county_data %>% filter(stateabbrv == "NY")
e_legend <- paste0("<strong>population unemployed: </strong>", hc_pp$`Month Number`)
e_legend2 <- paste0("<strong>Number of Hate Crimes: </strong>", hc_pp$Complaint_Count)
pal_use <- colorNumeric("Blues", NULL , n = 4)
pal_use2 <- colorNumeric("Reds", NULL , n = 4)
leaflet() %>%
leaflet::addPolygons(data = hc_pp,
stroke = FALSE,
fillColor = ~pal_use(`Month Number`),
fillOpacity = 1,
smoothFactor = 0.25,
popup = e_legend,
group = "Month Number") %>%
leaflet::addPolygons(data = hc_pp,
stroke = FALSE,
fillColor = ~pal_use2(Complaint_Count),
fillOpacity = 1,
smoothFactor = 0.25,
popup = e_legend2,
group = "Number of Hate Crimes") %>%
addLegend("bottomright",
pal=pal_use,
values=hc_pp$`Month Number`,
title = 'Month Number',
group = "Month Number") %>%
addLegend("bottomleft",
pal=pal_use2,
values=hc_pp$Complaint_Count,
title = 'Number of Hate Crimes',
group = "Number of Hate Crimes") %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addLayersControl(overlayGroups = c("Month Number", "Number of Hate Crimes"),
options = layersControlOptions(collapsed = FALSE))
leaflet() %>%
leaflet::addPolygons(data = borough_data,
stroke = FALSE,
fillColor = ~pal_use(popunemplo),
fillOpacity = 1,
smoothFactor = 0.25,
popup = e_legend,
group = "unemploy") %>%
leaflet::addPolygons(data = borough_data,
stroke = FALSE,
fillColor = ~pal_use2(poor),
fillOpacity = 1,
smoothFactor = 0.25,
popup = e_legend2,
group = "poverty") %>%
addLegend("bottomright",
pal=pal_use,
values=borough_data$popunemplo,
title = 'population unemployed',
group = "unemploy") %>%
addLegend("bottomleft",
pal=pal_use2,
values=borough_data$poor,
title = 'population beneath poverty line',
group = "poverty") %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addLayersControl(overlayGroups = c("unemploy", "poverty"),
options = layersControlOptions(collapsed = FALSE))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHNmKSAgICAgCmxpYnJhcnkoZHBseXIpICAgCmxpYnJhcnkoc3BEYXRhKSAKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KHVyYm5tYXByKQpsaWJyYXJ5KHNwZGVwKQpsaWJyYXJ5KHNwYXRpYWxyZWcpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeSh0aWR5dGVycmEpCmxpYnJhcnkodGVycmEpCgoKaGF0ZV9jcmltZXMgPC0gcmVhZF9jc3YoIn4vRG9jdW1lbnRzL0RJREEzNzAvTllQRF9IYXRlX0NyaW1lcy5jc3YiLCAKICAgICBjb2xfdHlwZXMgPSBjb2xzKGBGdWxsIENvbXBsYWludCBJRGAgPSBjb2xfbnVtYmVyKCksIAogICAgYE1vbnRoIE51bWJlcmAgPSBjb2xfaW50ZWdlcigpLCBgUmVjb3JkIENyZWF0ZSBEYXRlYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpKSkKaGMgPC0gcmVhZF9jc3YoIn4vRG9jdW1lbnRzL0RJREEzNzAvSGF0ZV9DcmltZXNfMjAxMC5jc3YiKQpzZXR3ZCgifi9Eb2N1bWVudHMvRElEQTM3MC9ueWNuaG9vZF9hY3MiKQpib3JvdWdoX2RhdGEgPC0gc3RfcmVhZCgiTllDX05ob29kIEFDUzIwMDhfMTIuc2hwIikKYGBgCgpgYGB7cn0Kc2V0d2QoIn4vRG9jdW1lbnRzL0RJREEzNzAvUG9saWNlIFByZWNpbmN0cyIpCnBwIDwtIHN0X3JlYWQoImdlb19leHBvcnRfYThhOTU2ZTAtNzJhOS00Zjg5LTg1ZGEtYTAxMjJhMzFjYWFjLnNocCIpCgpoY19wcCA8LSBoYXRlX2NyaW1lcyAlPiUgCiAgbGVmdF9qb2luKHBwLCBieSA9IGMoIkNvbXBsYWludCBQcmVjaW5jdCBDb2RlIiA9ICJwcmVjaW5jdCIpKQoKY29sbmFtZXMoaGNfcHApWzVdIDwtICJQcmVjaW5jdCIKCmhjX3BwIDwtIGhjX3BwICU+JQogIGdyb3VwX2J5KFByZWNpbmN0KSAlPiUKICBtdXRhdGUoQ29tcGxhaW50X0NvdW50ID0gbigpKSAlPiUgCiAgI3JlbG9jYXRlKENvbXBsYWludF9Db3VudCkKICBtdXRhdGUoUHJlY2luY3QgPSBhcy5udW1lcmljKFByZWNpbmN0KSkgJT4lIAogIHNlbGVjdCgtYyhgRnVsbCBDb21wbGFpbnQgSURgLCBgT2ZmZW5zZSBDYXRlZ29yeWAsIGBCaWFzIE1vdGl2ZSBEZXNjcmlwdGlvbmAsYE9mZmVuc2UgRGVzY3JpcHRpb25gLCBgUGF0cm9sIEJvcm91Z2ggTmFtZWAsIENvdW50eSwgYExhdyBDb2RlIENhdGVnb3J5IERlc2NyaXB0aW9uYCwgYFBEIENvZGUgRGVzY3JpcHRpb25gLGBBcnJlc3QgRGF0ZWAsIGBBcnJlc3QgSWRgLCBzaGFwZV9hcmVhLCBzaGFwZV9sZW5nLGBDb21wbGFpbnQgWWVhciBOdW1iZXJgLGBNb250aCBOdW1iZXJgLGBSZWNvcmQgQ3JlYXRlIERhdGVgKSkKYGBgCgoKYGBge3J9CmdncGxvdCgpKwogIGdlb21fc2YoZGF0YSA9IGhjX3BwLCBtYXBwaW5nPWFlcyhmaWxsID0gQ29tcGxhaW50X0NvdW50LCBnZW9tZXRyeT1nZW9tZXRyeSkpICsKICBsYWJzKGZpbGwgPSAiQ29tcGxhaW50IENvdW50IikrCiAgdGhlbWVfdm9pZCgpCmBgYAoKCmBgYHtyfQpkZW1vZ19kYXRhIDwtIHN0X3JlYWQoIkVOREdCVi5jc3YiKQoKcmFuZF9zYW1wbGUgPC0gZGVtb2dfZGF0YSAlPiUgCiAgc2xpY2Vfc2FtcGxlKG4gPSAxMDAwLCByZXBsYWNlID0gRkFMU0UpCgpyYW5kX3NhbXBsZSA8LSByYW5kX3NhbXBsZSAlPiUgCiAgc2VsZWN0KGMoSW5jaWRlbnQuUHJlY2luY3QuQ29kZSwgUG92ZXJ0eSkpCgpyYW5kX3NhbXBsZSRQb3ZlcnR5W3JhbmRfc2FtcGxlJFBvdmVydHk9PSIiXTwtMAojaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjEyNDM1ODgvcmVwbGFjZS1ibGFuay1jZWxscy13aXRoLWNoYXJhY3RlcgoKcmFuZF9zYW1wbGUgPC0gcmFuZF9zYW1wbGUgJT4lCiAgbXV0YXRlKEluY2lkZW50LlByZWNpbmN0LkNvZGUgPSBhcy5udW1lcmljKEluY2lkZW50LlByZWNpbmN0LkNvZGUpKQoKZnVsbF9kYXRhIDwtIGhjX3BwICU+JSAKICBsZWZ0X2pvaW4ocmFuZF9zYW1wbGUsIGJ5ID0gYygiUHJlY2luY3QiID0gIkluY2lkZW50LlByZWNpbmN0LkNvZGUiKSkKCnJhbmRfZnVsbCA8LSBmdWxsX2RhdGEgJT4lIAogIHNsaWNlX3NhbXBsZShuID0gMTAwMCwgcmVwbGFjZSA9IEYpCgpWaWV3KHJhbmRfZnVsbCkKYGBgCgoKYGBge3J9CmdncGxvdCgpKwogIGdlb21fc2YoZGF0YSA9IGZ1bGxfZGF0YSwgbWFwcGluZz1hZXMoZmlsbCA9IENvbXBsYWludF9Db3VudCwgZ2VvbWV0cnk9Z2VvbWV0cnkpKSArCiAgbGFicyhmaWxsID0gIkNvbXBsYWludCBDb3VudCIpKwogIHRoZW1lX3ZvaWQoKQoKYGBgCgoKYGBge3J9CmNvdW50eV9kYXRhIDwtIHJlYWQuY3N2KCJjb3VudHlfZGF0YS5jc3YiKQoKc2V0d2QoIn4vRG9jdW1lbnRzL0RJREEzNzAvbnljbmhvb2RfYWNzIikKYm9yb3VnaF9kYXRhIDwtIHN0X3JlYWQoIk5ZQ19OaG9vZCBBQ1MyMDA4XzEyLnNocCIpCmBgYAoKYGBge3J9CmNvdW50eV9kYXRhIDwtIGNvdW50eV9kYXRhICU+JSBmaWx0ZXIoc3RhdGVhYmJydiA9PSAiTlkiKQplX2xlZ2VuZCA8LSBwYXN0ZTAoIjxzdHJvbmc+cG9wdWxhdGlvbiB1bmVtcGxveWVkOiA8L3N0cm9uZz4iLCBoY19wcCRgTW9udGggTnVtYmVyYCkKZV9sZWdlbmQyIDwtIHBhc3RlMCgiPHN0cm9uZz5OdW1iZXIgb2YgSGF0ZSBDcmltZXM6IDwvc3Ryb25nPiIsIGhjX3BwJENvbXBsYWludF9Db3VudCkKCnBhbF91c2UgPC0gY29sb3JOdW1lcmljKCJCbHVlcyIsIE5VTEwgLCBuID0gNCkKcGFsX3VzZTIgPC0gY29sb3JOdW1lcmljKCJSZWRzIiwgTlVMTCAsIG4gPSA0KQoKbGVhZmxldCgpICU+JQogIGxlYWZsZXQ6OmFkZFBvbHlnb25zKGRhdGEgPSBoY19wcCwgCiAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfdXNlKGBNb250aCBOdW1iZXJgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjI1LCAKICAgICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IGVfbGVnZW5kLAogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gIk1vbnRoIE51bWJlciIpICU+JSAgIAogIGxlYWZsZXQ6OmFkZFBvbHlnb25zKGRhdGEgPSBoY19wcCwgCiAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfdXNlMihDb21wbGFpbnRfQ291bnQpLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMjUsIAogICAgICAgICAgICAgICAgICAgICAgIHBvcHVwID0gZV9sZWdlbmQyLAogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gIk51bWJlciBvZiBIYXRlIENyaW1lcyIpICU+JSAKICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwgIAogICAgICAgICAgICBwYWw9cGFsX3VzZSwgICAgCiAgICAgICAgICAgIHZhbHVlcz1oY19wcCRgTW9udGggTnVtYmVyYCwKICAgICAgICAgICAgdGl0bGUgPSAnTW9udGggTnVtYmVyJywKICAgICAgICAgICAgZ3JvdXAgPSAiTW9udGggTnVtYmVyIikgJT4lIAogICAgYWRkTGVnZW5kKCJib3R0b21sZWZ0IiwgIAogICAgICAgICAgICBwYWw9cGFsX3VzZTIsICAgIAogICAgICAgICAgICB2YWx1ZXM9aGNfcHAkQ29tcGxhaW50X0NvdW50LCAKICAgICAgICAgICAgdGl0bGUgPSAnTnVtYmVyIG9mIEhhdGUgQ3JpbWVzJywKICAgICAgICAgICAgZ3JvdXAgPSAiTnVtYmVyIG9mIEhhdGUgQ3JpbWVzIikgJT4lIAogIGFkZFRpbGVzKCkgJT4lIAogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24pICU+JSAKICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCJNb250aCBOdW1iZXIiLCAiTnVtYmVyIG9mIEhhdGUgQ3JpbWVzIiksCiAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpKQoKYGBgCgpgYGB7cn0KbGVhZmxldCgpICU+JQogIGxlYWZsZXQ6OmFkZFBvbHlnb25zKGRhdGEgPSBib3JvdWdoX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsX3VzZShwb3B1bmVtcGxvKSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjI1LCAKICAgICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IGVfbGVnZW5kLAogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gInVuZW1wbG95IikgJT4lICAgCiAgbGVhZmxldDo6YWRkUG9seWdvbnMoZGF0YSA9IGJvcm91Z2hfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfdXNlMihwb29yKSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjI1LCAKICAgICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IGVfbGVnZW5kMiwKICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9ICJwb3ZlcnR5IikgJT4lIAogIGFkZExlZ2VuZCgiYm90dG9tcmlnaHQiLCAgCiAgICAgICAgICAgIHBhbD1wYWxfdXNlLCAgICAKICAgICAgICAgICAgdmFsdWVzPWJvcm91Z2hfZGF0YSRwb3B1bmVtcGxvLAogICAgICAgICAgICB0aXRsZSA9ICdwb3B1bGF0aW9uIHVuZW1wbG95ZWQnLAogICAgICAgICAgICBncm91cCA9ICJ1bmVtcGxveSIpICU+JSAKICAgIGFkZExlZ2VuZCgiYm90dG9tbGVmdCIsICAKICAgICAgICAgICAgcGFsPXBhbF91c2UyLCAgICAKICAgICAgICAgICAgdmFsdWVzPWJvcm91Z2hfZGF0YSRwb29yLCAKICAgICAgICAgICAgdGl0bGUgPSAncG9wdWxhdGlvbiBiZW5lYXRoIHBvdmVydHkgbGluZScsCiAgICAgICAgICAgIGdyb3VwID0gInBvdmVydHkiKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lIAogIGFkZExheWVyc0NvbnRyb2wob3ZlcmxheUdyb3VwcyA9IGMoInVuZW1wbG95IiwgInBvdmVydHkiKSwKICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhjb2xsYXBzZWQgPSBGQUxTRSkpCgpgYGAKCg==