R Spatial Lab Assignment # 2

task 1: Join the COVID-19 data to the NYC zip code area data (sf or sp polygons).

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(readr)
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
load("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/nyc_spatial_data.RData")

tests_by_zcta_2020_04_12 <- readr::read_csv("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/tests-by-zcta_2020_04_12.csv", lazy = FALSE) 
## Rows: 178 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): MODZCTA, Positive, Total, zcta_cum.perc_pos
## 
## ℹ 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.
zipcode_tests <- tests_by_zcta_2020_04_12 %>%
  rename("ZIPCODE" = "MODZCTA")

str(zipcode_tests)
## spc_tbl_ [178 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ ZIPCODE          : num [1:178] NA 10001 10002 10003 10004 ...
##  $ Positive         : num [1:178] 1934 211 539 279 23 ...
##  $ Total            : num [1:178] 2082 448 1024 662 59 ...
##  $ zcta_cum.perc_pos: num [1:178] 92.9 47.1 52.6 42.1 39 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   MODZCTA = col_double(),
##   ..   Positive = col_double(),
##   ..   Total = col_double(),
##   ..   zcta_cum.perc_pos = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
tests_clean <- tests_by_zcta_2020_04_12 %>%
  mutate(MODZCTA = as.character(MODZCTA)) %>%
  filter(!is.na(MODZCTA))


zip_covid <- base::merge(nyc_zipcode, zipcode_tests, by.x = "ZIPCODE", by.y = "ZIPCODE")
 str(zip_covid)
## Classes 'sf' and 'data.frame':   189 obs. of  16 variables:
##  $ ZIPCODE          : chr  "10001" "10002" "10003" "10004" ...
##  $ BLDGZIP          : chr  "0" "0" "0" "0" ...
##  $ PO_NAME          : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION       : num  22413 81305 55878 2187 2187 ...
##  $ AREA             : num  17794941 26280129 15538376 670708 4002521 ...
##  $ STATE            : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY           : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS          : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS         : chr  "061" "061" "061" "061" ...
##  $ URL              : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Positive         : num  211 539 279 23 23 23 23 38 10 34 ...
##  $ Total            : num  448 1024 662 59 59 ...
##  $ zcta_cum.perc_pos: num  47.1 52.6 42.1 39 39 ...
##  $ geometry         :sfc_POLYGON of length 189; first list element: List of 1
##   ..$ : num [1:110, 1:2] 981959 981980 981988 981993 982052 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:15] "ZIPCODE" "BLDGZIP" "PO_NAME" "POPULATION" ...

task 2:Aggregate the NYC food retails store data (points) to the zip code data, so that we know how many retail stores in each zip code area. Note that not all locations are for food retail. And we need to choose the specific types according to the data.

library(sf)
library(dplyr)

food_sf <- st_read("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/nycFoodStore.shp")
## Reading layer `nycFoodStore' from data source 
##   `/Users/emilycoty/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/nycFoodStore.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 11300 features and 16 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -74.2484 ymin: 40.50782 xmax: -73.67061 ymax: 40.91008
## Geodetic CRS:  WGS 84
str(food_sf)
## Classes 'sf' and 'data.frame':   11300 obs. of  17 variables:
##  $ ï__Cnty : chr  "Bronx" "Bronx" "Bronx" "Bronx" ...
##  $ Lcns_Nm : int  734149 606221 606228 723375 724807 712943 703060 609065 722972 609621 ...
##  $ Oprtn_T : chr  "Store" "Store" "Store" "Store" ...
##  $ Estbl_T : chr  "JAC" "JAC" "JAC" "JAC" ...
##  $ Entty_N : chr  "7 ELEVEN FOOD STORE #37933H" "1001 SAN MIGUEL FOOD CENTER INC" "1029 FOOD PLAZA INC" "1078 DELI GROCERY CORP" ...
##  $ DBA_Nam : chr  NA "1001 SAN MIGUEL FD CNTR" "1029 FOOD PLAZA" "1078 DELI GROCERY" ...
##  $ Strt_Nmb: chr  "500" "1001" "122" "1078" ...
##  $ Stret_Nm: chr  "BAYCHESTER AVE" "SHERIDAN AVE" "E 181ST ST" "EAST 165TH STREET" ...
##  $ Add_L_2 : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Add_L_3 : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ City    : chr  "BRONX" "BRONX" "BRONX" "BRONX" ...
##  $ State   : chr  "NY" "NY" "NY" "NY" ...
##  $ Zip_Cod : int  10475 10456 10453 10459 10456 10453 10467 10456 10456 10472 ...
##  $ Sqr_Ftg : chr  "0" "1,100" "2,000" "1,200" ...
##  $ Locatin : chr  "500 BAYCHESTER AVE\nBRONX, NY 10475\n(40.869156, -73.831875)" "1001 SHERIDAN AVE\nBRONX, NY 10456\n(40.829061, -73.919613)" "122 E 181ST ST\nBRONX, NY 10453\n(40.854755, -73.902853)" "1078 EAST 165TH STREET\nBRONX, NY 10459\n(40.825105, -73.890589)" ...
##  $ Coords  : chr  "40.869156, -73.831875" "40.829061, -73.919613" "40.854755, -73.902853" "40.825105, -73.890589" ...
##  $ geometry:sfc_POINT of length 11300; first list element:  'XY' num  -73.8 40.9
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:16] "ï__Cnty" "Lcns_Nm" "Oprtn_T" "Estbl_T" ...
food_retail <- food_sf %>% 
  filter(Estbl_T == "JAC")
str(food_retail)
## Classes 'sf' and 'data.frame':   8457 obs. of  17 variables:
##  $ ï__Cnty : chr  "Bronx" "Bronx" "Bronx" "Bronx" ...
##  $ Lcns_Nm : int  734149 606221 606228 723375 724807 712943 703060 609065 609621 722155 ...
##  $ Oprtn_T : chr  "Store" "Store" "Store" "Store" ...
##  $ Estbl_T : chr  "JAC" "JAC" "JAC" "JAC" ...
##  $ Entty_N : chr  "7 ELEVEN FOOD STORE #37933H" "1001 SAN MIGUEL FOOD CENTER INC" "1029 FOOD PLAZA INC" "1078 DELI GROCERY CORP" ...
##  $ DBA_Nam : chr  NA "1001 SAN MIGUEL FD CNTR" "1029 FOOD PLAZA" "1078 DELI GROCERY" ...
##  $ Strt_Nmb: chr  "500" "1001" "122" "1078" ...
##  $ Stret_Nm: chr  "BAYCHESTER AVE" "SHERIDAN AVE" "E 181ST ST" "EAST 165TH STREET" ...
##  $ Add_L_2 : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Add_L_3 : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ City    : chr  "BRONX" "BRONX" "BRONX" "BRONX" ...
##  $ State   : chr  "NY" "NY" "NY" "NY" ...
##  $ Zip_Cod : int  10475 10456 10453 10459 10456 10453 10467 10456 10472 10452 ...
##  $ Sqr_Ftg : chr  "0" "1,100" "2,000" "1,200" ...
##  $ Locatin : chr  "500 BAYCHESTER AVE\nBRONX, NY 10475\n(40.869156, -73.831875)" "1001 SHERIDAN AVE\nBRONX, NY 10456\n(40.829061, -73.919613)" "122 E 181ST ST\nBRONX, NY 10453\n(40.854755, -73.902853)" "1078 EAST 165TH STREET\nBRONX, NY 10459\n(40.825105, -73.890589)" ...
##  $ Coords  : chr  "40.869156, -73.831875" "40.829061, -73.919613" "40.854755, -73.902853" "40.825105, -73.890589" ...
##  $ geometry:sfc_POINT of length 8457; first list element:  'XY' num  -73.8 40.9
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:16] "ï__Cnty" "Lcns_Nm" "Oprtn_T" "Estbl_T" ...
food_clean <- food_retail %>%
  rename("ZIPCODE" = "Zip_Cod")

food_clean2 <- st_transform(food_clean, st_crs(nyc_zipcode))

food_zip <- sf::st_join(nyc_zipcode, food_clean2, y.x = "ZIPCODE", by.y = "ZIPCODE")

food_counts <- food_zip %>%
  st_drop_geometry() %>%
  group_by("ZIPCODE") %>%
  summarise(food_count = n())

covid_food <- zip_covid %>%
  sf::st_join(food_zip, by = "ZIPCODE")
str(covid_food)
## Classes 'sf' and 'data.frame':   48681 obs. of  44 variables:
##  $ ZIPCODE          : chr  "10001" "10001" "10001" "10001" ...
##  $ BLDGZIP.x        : chr  "0" "0" "0" "0" ...
##  $ PO_NAME.x        : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION.x     : num  22413 22413 22413 22413 22413 ...
##  $ AREA.x           : num  17794941 17794941 17794941 17794941 17794941 ...
##  $ STATE.x          : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY.x         : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS.x        : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS.x       : chr  "061" "061" "061" "061" ...
##  $ URL.x            : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA.x     : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN.x      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Positive         : num  211 211 211 211 211 211 211 211 211 211 ...
##  $ Total            : num  448 448 448 448 448 448 448 448 448 448 ...
##  $ zcta_cum.perc_pos: num  47.1 47.1 47.1 47.1 47.1 47.1 47.1 47.1 47.1 47.1 ...
##  $ ZIPCODE.x        : chr  "10018" "10018" "10018" "10018" ...
##  $ BLDGZIP.y        : chr  "0" "0" "0" "0" ...
##  $ PO_NAME.y        : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION.y     : num  5503 5503 5503 5503 5503 ...
##  $ AREA.y           : num  10705796 10705796 10705796 10705796 10705796 ...
##  $ STATE.y          : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY.y         : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS.y        : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS.y       : chr  "061" "061" "061" "061" ...
##  $ URL.y            : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA.y     : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN.y      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ ï__Cnty          : chr  "New York" "New York" "New York" "New York" ...
##  $ Lcns_Nm          : int  628102 628578 730402 717908 731206 625386 734220 629096 706473 722643 ...
##  $ Oprtn_T          : chr  "Store" "Store" "Store" "Store" ...
##  $ Estbl_T          : chr  "JAC" "JAC" "JAC" "JAC" ...
##  $ Entty_N          : chr  "10TH AVE PETROLEUM LLC" "535 8TH AVENUE CORP" "GEN 2 ENTERPRISES INC" "ADVANCED FRESH CONCEPTS FRANCHISE" ...
##  $ DBA_Nam          : chr  "10TH AVE PETROLEUM" "7-ELEVEN STORE 39308A" "7 ELEVEN STORE # 39875A" "AFC SUSHI @ DUANE READE" ...
##  $ Strt_Nmb         : chr  "466" "535" "589" "1430" ...
##  $ Stret_Nm         : chr  "10TH AVE" "8TH AVE" "8TH AVE" "BROADWAY FRONT 1" ...
##  $ Add_L_2          : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Add_L_3          : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ City             : chr  "NEW YORK" "NEW YORK" "NEW YORK" "NEW YORK" ...
##  $ State            : chr  "NY" "NY" "NY" "NY" ...
##  $ ZIPCODE.y        : int  10018 10018 10018 10018 10018 10018 10018 10018 10018 10001 ...
##  $ Sqr_Ftg          : chr  "1,000" "10,000" "0" "200" ...
##  $ Locatin          : chr  "466 10TH AVE\nNEW YORK, NY 10018\n(40.756122, -73.998042)" "535 8TH AVE\nNEW YORK, NY 10018\n(40.754025, -73.992137)" "589 8TH AVE\nNEW YORK, NY 10018\n(40.755207, -73.991284)" "1430 BROADWAY\nNEW YORK, NY 10018\n(40.754007, -73.98697)" ...
##  $ Coords           : chr  "40.756122, -73.998042" "40.754025, -73.992137" "40.755207, -73.991284" "40.754007, -73.98697" ...
##  $ geometry         :sfc_POLYGON of length 48681; first list element: List of 1
##   ..$ : num [1:110, 1:2] 981959 981980 981988 981993 982052 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:43] "ZIPCODE" "BLDGZIP.x" "PO_NAME.x" "POPULATION.x" ...

task 3:Aggregate the NYC health facilities (points) to the zip code data. Similarly, choose appropriate sub-types such as nursing homes from the facilities.

nysHF <- read_csv("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/NYS_Health_Facility.csv") %>%
  rename("ZIPCODE" = "Facility Zip Code")
## Rows: 3990 Columns: 36
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (28): Facility Name, Short Description, Description, Facility Open Date,...
## dbl  (8): Facility ID, Facility Phone Number, Facility Fax Number, Facility ...
## 
## ℹ 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.
hf_zip_state <- base::merge(nyc_zipcode, nysHF, by.x = "ZIPCODE", by.y = "ZIPCODE") 
str(hf_zip_state)
## Classes 'sf' and 'data.frame':   1403 obs. of  48 variables:
##  $ ZIPCODE                     : chr  "10001" "10001" "10001" "10001" ...
##  $ BLDGZIP                     : chr  "0" "0" "0" "0" ...
##  $ PO_NAME                     : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION                  : num  22413 22413 22413 22413 22413 ...
##  $ AREA                        : num  17794941 17794941 17794941 17794941 17794941 ...
##  $ STATE                       : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY                      : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS                     : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS                    : chr  "061" "061" "061" "061" ...
##  $ URL                         : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA                  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN                   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Facility ID                 : num  3095 7815 1536 9529 7699 ...
##  $ Facility Name               : chr  "Greenwich House Counseling Center" "Extended Home Care" "Lower Manhattan Health District" "The New Jewish Home, Home Care" ...
##  $ Short Description           : chr  "DTC-EC" "CHHA" "DTC-EC" "CHHA" ...
##  $ Description                 : chr  "Diagnostic and Treatment Center Extension Clinic" "Certified Home Health Agency" "Diagnostic and Treatment Center Extension Clinic" "Certified Home Health Agency" ...
##  $ Facility Open Date          : chr  "08/17/1983" "05/11/1999" "09/27/1979" "08/15/2013" ...
##  $ Facility Address 1          : chr  "122 West 27th Street" "360 West 31st St, 3rd Floor" "303 9th Avenue" "104 West 29th Street, 8th floor" ...
##  $ Facility Address 2          : chr  NA NA NA NA ...
##  $ Facility City               : chr  "New York" "New York" "New York" "New York" ...
##  $ Facility State              : chr  "New York" "New York" "New York" "New York" ...
##  $ Facility Phone Number       : num  2.13e+09 2.13e+09 2.12e+09 2.12e+09 2.13e+09 ...
##  $ Facility Fax Number         : num  NA NA NA 2.13e+09 NA ...
##  $ Facility Website            : chr  NA NA NA NA ...
##  $ Facility County Code        : num  7093 7093 7093 7093 7093 ...
##  $ Facility County             : chr  "New York" "New York" "New York" "New York" ...
##  $ Regional Office ID          : num  5 5 5 5 5 5 5 5 5 5 ...
##  $ Regional Office             : chr  "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" ...
##  $ Main Site Name              : chr  "Greenwich House Methadone" NA "New York City Department of Health and Mental Hygiene" NA ...
##  $ Main Site Facility ID       : num  2941 NA 1339 NA NA ...
##  $ Operating Certificate Number: chr  "7002287R" "7002653" "7002112R" "7002659" ...
##  $ Operator Name               : chr  "Co-Operative Social Settlement Society of New York City" "Extended Nursing Personnel CHHA, LLC" "City of New York" "Jewish Home Lifecare, Community Services" ...
##  $ Operator Address 1          : chr  "27 Barrow Street" "360 West 31st Street, 3rd Floor" "250 Church Street" "120 West 106th Street" ...
##  $ Operator Address 2          : chr  NA NA NA NA ...
##  $ Operator City               : chr  "New York" "New York" "New York" "New York" ...
##  $ Operator State              : chr  "New York" "New York" "New York" "New York" ...
##  $ Operator Zip Code           : chr  "10014" "10001" "10013" "10025" ...
##  $ Cooperator Name             : chr  NA NA NA NA ...
##  $ Cooperator Address          : chr  NA NA NA NA ...
##  $ Cooperator Address 2        : chr  NA NA NA NA ...
##  $ Cooperator City             : chr  NA NA NA NA ...
##  $ Cooperator State            : chr  "New York" "New York" "New York" "New York" ...
##  $ Cooperator Zip Code         : chr  NA NA NA NA ...
##  $ Ownership Type              : chr  "Not for Profit Corporation" "LLC" "Municipality" "Not for Profit Corporation" ...
##  $ Facility Latitude           : num  40.7 40.8 40.7 40.7 40.8 ...
##  $ Facility Longitude          : num  -74 -74 -74 -74 -74 ...
##  $ Facility Location           : chr  "(40.745731, -73.991859)" "(40.751484, -73.99781)" "(40.749596, -73.999138)" "(40.746712, -73.990334)" ...
##  $ geometry                    :sfc_POLYGON of length 1403; first list element: List of 1
##   ..$ : num [1:110, 1:2] 981959 981980 981988 981993 982052 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:47] "ZIPCODE" "BLDGZIP" "PO_NAME" "POPULATION" ...
library(dplyr)

hf_zip_state <- hf_zip_state %>%
  rename(short_desc = `Short Description`)

hf_filter <- hf_zip_state %>%
  filter(short_desc %in% c("NH", "HSPC"))

hf_nyc <- hf_zip_state %>%
  filter(COUNTY %in% c("New York", "Kings", "Queens", "Bronx", "Richmond"))

covid_food_hf <- hf_filter %>%
  sf::st_join(covid_food, by = "ZIPCODE")
str(covid_food_hf)
## Classes 'sf' and 'data.frame':   353981 obs. of  91 variables:
##  $ ZIPCODE.x                   : chr  "10002" "10002" "10002" "10002" ...
##  $ BLDGZIP                     : chr  "0" "0" "0" "0" ...
##  $ PO_NAME                     : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION                  : num  81305 81305 81305 81305 81305 ...
##  $ AREA                        : num  26280129 26280129 26280129 26280129 26280129 ...
##  $ STATE                       : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY                      : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS                     : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS                    : chr  "061" "061" "061" "061" ...
##  $ URL                         : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA                  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN                   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Facility ID                 : num  1578 1578 1578 1578 1578 ...
##  $ Facility Name               : chr  "New East Side Nursing Home" "New East Side Nursing Home" "New East Side Nursing Home" "New East Side Nursing Home" ...
##  $ short_desc                  : chr  "NH" "NH" "NH" "NH" ...
##  $ Description                 : chr  "Residential Health Care Facility - SNF" "Residential Health Care Facility - SNF" "Residential Health Care Facility - SNF" "Residential Health Care Facility - SNF" ...
##  $ Facility Open Date          : chr  "12/01/1981" "12/01/1981" "12/01/1981" "12/01/1981" ...
##  $ Facility Address 1          : chr  "25 Bialystoker Place" "25 Bialystoker Place" "25 Bialystoker Place" "25 Bialystoker Place" ...
##  $ Facility Address 2          : chr  NA NA NA NA ...
##  $ Facility City               : chr  "New York" "New York" "New York" "New York" ...
##  $ Facility State              : chr  "New York" "New York" "New York" "New York" ...
##  $ Facility Phone Number       : num  2.13e+09 2.13e+09 2.13e+09 2.13e+09 2.13e+09 ...
##  $ Facility Fax Number         : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Facility Website            : chr  NA NA NA NA ...
##  $ Facility County Code        : num  7093 7093 7093 7093 7093 ...
##  $ Facility County             : chr  "New York" "New York" "New York" "New York" ...
##  $ Regional Office ID          : num  5 5 5 5 5 5 5 5 5 5 ...
##  $ Regional Office             : chr  "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" "Metropolitan Area Regional Office - New York City" ...
##  $ Main Site Name              : chr  NA NA NA NA ...
##  $ Main Site Facility ID       : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Operating Certificate Number: chr  "7002358N" "7002358N" "7002358N" "7002358N" ...
##  $ Operator Name               : chr  "New East Side Nursing Home LLC" "New East Side Nursing Home LLC" "New East Side Nursing Home LLC" "New East Side Nursing Home LLC" ...
##  $ Operator Address 1          : chr  "25 Bialystroker Place" "25 Bialystroker Place" "25 Bialystroker Place" "25 Bialystroker Place" ...
##  $ Operator Address 2          : chr  NA NA NA NA ...
##  $ Operator City               : chr  "New York" "New York" "New York" "New York" ...
##  $ Operator State              : chr  "New York" "New York" "New York" "New York" ...
##  $ Operator Zip Code           : chr  "10002" "10002" "10002" "10002" ...
##  $ Cooperator Name             : chr  NA NA NA NA ...
##  $ Cooperator Address          : chr  NA NA NA NA ...
##  $ Cooperator Address 2        : chr  NA NA NA NA ...
##  $ Cooperator City             : chr  NA NA NA NA ...
##  $ Cooperator State            : chr  "New York" "New York" "New York" "New York" ...
##  $ Cooperator Zip Code         : chr  NA NA NA NA ...
##  $ Ownership Type              : chr  "LLC" "LLC" "LLC" "LLC" ...
##  $ Facility Latitude           : num  40.7 40.7 40.7 40.7 40.7 ...
##  $ Facility Longitude          : num  -74 -74 -74 -74 -74 ...
##  $ Facility Location           : chr  "(40.715988, -73.982857)" "(40.715988, -73.982857)" "(40.715988, -73.982857)" "(40.715988, -73.982857)" ...
##  $ ZIPCODE.y                   : chr  "10002" "10002" "10002" "10002" ...
##  $ BLDGZIP.x                   : chr  "0" "0" "0" "0" ...
##  $ PO_NAME.x                   : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION.x                : num  81305 81305 81305 81305 81305 ...
##  $ AREA.x                      : num  26280129 26280129 26280129 26280129 26280129 ...
##  $ STATE.x                     : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY.x                    : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS.x                   : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS.x                  : chr  "061" "061" "061" "061" ...
##  $ URL.x                       : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA.x                : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN.x                 : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Positive                    : num  539 539 539 539 539 539 539 539 539 539 ...
##  $ Total                       : num  1024 1024 1024 1024 1024 ...
##  $ zcta_cum.perc_pos           : num  52.6 52.6 52.6 52.6 52.6 ...
##  $ ZIPCODE.x.1                 : chr  "10010" "10010" "10010" "10010" ...
##  $ BLDGZIP.y                   : chr  "0" "0" "0" "0" ...
##  $ PO_NAME.y                   : chr  "New York" "New York" "New York" "New York" ...
##  $ POPULATION.y                : num  29881 29881 29881 29881 29881 ...
##  $ AREA.y                      : num  9768396 9768396 9768396 9768396 9768396 ...
##  $ STATE.y                     : chr  "NY" "NY" "NY" "NY" ...
##  $ COUNTY.y                    : chr  "New York" "New York" "New York" "New York" ...
##  $ ST_FIPS.y                   : chr  "36" "36" "36" "36" ...
##  $ CTY_FIPS.y                  : chr  "061" "061" "061" "061" ...
##  $ URL.y                       : chr  "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" "http://www.usps.com/" ...
##  $ SHAPE_AREA.y                : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ SHAPE_LEN.y                 : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ ï__Cnty                     : chr  "New York" "New York" "New York" "New York" ...
##  $ Lcns_Nm                     : int  627975 627670 628291 629161 717944 626039 728604 702015 625375 723867 ...
##  $ Oprtn_T                     : chr  "Store" "Store" "Store" "Store" ...
##  $ Estbl_T                     : chr  "JAC" "JAC" "JAC" "JAC" ...
##  $ Entty_N                     : chr  "21 BERRY DELI INC" "222 MARKET CORP" "3RD AVE FOOD CORP I" "710 FRANKLIN AVE CORP" ...
##  $ DBA_Nam                     : chr  "21 BERRY DELI" "222 MARKET" "3RD AVE FOOD" "7-ELEVEN STORE 34764A" ...
##  $ Strt_Nmb                    : chr  "922" "384" "325" "333" ...
##  $ Stret_Nm                    : chr  "BROADWAY" "2ND AVE" "3RD AVE" "E 23RD ST" ...
##  $ Add_L_2                     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ Add_L_3                     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ City                        : chr  "NEW YORK" "NEW YORK" "NEW YORK" "NEW YORK" ...
##  $ State                       : chr  "NY" "NY" "NY" "NY" ...
##  $ ZIPCODE.y.1                 : int  10010 10010 10010 10010 10010 10010 10001 10010 10011 10010 ...
##  $ Sqr_Ftg                     : chr  "2,000" "1,300" "1,200" "6,000" ...
##  $ Locatin                     : chr  "922 BROADWAY\nNEW YORK, NY 10010\n(40.739867, -73.989581)" "384 2ND AVE\nNEW YORK, NY 10010\n(40.737516, -73.981162)" "325 3RD AVE\nNEW YORK, NY 10010\n(40.739728, -73.982496)" "333 E 23RD ST\nNEW YORK, NY 10010\n(40.737173, -73.979195)" ...
##  $ Coords                      : chr  "40.739867, -73.989581" "40.737516, -73.981162" "40.739728, -73.982496" "40.737173, -73.979195" ...
##  $ geometry                    :sfc_POLYGON of length 353981; first list element: List of 1
##   ..$ : num [1:559, 1:2] 991340 991330 991328 991327 991326 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:90] "ZIPCODE.x" "BLDGZIP" "PO_NAME" "POPULATION" ...

task 4:Join the Census ACS population, race, and age data to the NYC Planning Census Tract Data.

ACS_data <- read_csv("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/ACSDP5Y2018.DP05_data_with_overlays_2020-04-22T132935.csv")
## Rows: 2168 Columns: 358
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (358): GEO_ID, NAME, DP05_0031PM, DP05_0032E, DP05_0032M, DP05_0032PE, D...
## 
## ℹ 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.
str(ACS_data)
## spc_tbl_ [2,168 × 358] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ GEO_ID     : chr [1:2168] "id" "1400000US36005000100" "1400000US36005000200" "1400000US36005000400" ...
##  $ NAME       : chr [1:2168] "Geographic Area Name" "Census Tract 1, Bronx County, New York" "Census Tract 2, Bronx County, New York" "Census Tract 4, Bronx County, New York" ...
##  $ DP05_0031PM: chr [1:2168] "Percent Margin of Error!!SEX AND AGE!!Total population!!65 years and over!!Female" "50.4" "9.5" "8.8" ...
##  $ DP05_0032E : chr [1:2168] "Estimate!!SEX AND AGE!!Total population!!65 years and over!!Sex ratio (males per 100 females)" "200.0" "95.1" "91.4" ...
##  $ DP05_0032M : chr [1:2168] "Margin of Error!!SEX AND AGE!!Total population!!65 years and over!!Sex ratio (males per 100 females)" "1316.0" "37.2" "32.7" ...
##  $ DP05_0032PE: chr [1:2168] "Percent Estimate!!SEX AND AGE!!Total population!!65 years and over!!Sex ratio (males per 100 females)" "(X)" "(X)" "(X)" ...
##  $ DP05_0032PM: chr [1:2168] "Percent Margin of Error!!SEX AND AGE!!Total population!!65 years and over!!Sex ratio (males per 100 females)" "(X)" "(X)" "(X)" ...
##  $ DP05_0033E : chr [1:2168] "Estimate!!RACE!!Total population" "7080" "4542" "5634" ...
##  $ DP05_0033M : chr [1:2168] "Margin of Error!!RACE!!Total population" "290" "574" "517" ...
##  $ DP05_0033PE: chr [1:2168] "Percent Estimate!!RACE!!Total population" "7080" "4542" "5634" ...
##  $ DP05_0033PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population" "(X)" "(X)" "(X)" ...
##  $ DP05_0034E : chr [1:2168] "Estimate!!RACE!!Total population!!One race" "7012" "4349" "5425" ...
##  $ DP05_0034M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race" "289" "557" "532" ...
##  $ DP05_0034PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race" "99.0" "95.8" "96.3" ...
##  $ DP05_0034PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race" "0.6" "3.4" "2.1" ...
##  $ DP05_0035E : chr [1:2168] "Estimate!!RACE!!Total population!!Two or more races" "68" "193" "209" ...
##  $ DP05_0035M : chr [1:2168] "Margin of Error!!RACE!!Total population!!Two or more races" "42" "155" "117" ...
##  $ DP05_0035PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!Two or more races" "1.0" "4.2" "3.7" ...
##  $ DP05_0035PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!Two or more races" "0.6" "3.4" "2.1" ...
##  $ DP05_0036E : chr [1:2168] "Estimate!!RACE!!Total population!!One race" "7012" "4349" "5425" ...
##  $ DP05_0036M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race" "289" "557" "532" ...
##  $ DP05_0036PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race" "99.0" "95.8" "96.3" ...
##  $ DP05_0036PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race" "0.6" "3.4" "2.1" ...
##  $ DP05_0037E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!White" "1773" "2165" "2623" ...
##  $ DP05_0037M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!White" "248" "547" "427" ...
##  $ DP05_0037PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!White" "25.0" "47.7" "46.6" ...
##  $ DP05_0037PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!White" "3.2" "11.1" "7.8" ...
##  $ DP05_0038E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Black or African American" "4239" "1279" "1699" ...
##  $ DP05_0038M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Black or African American" "286" "472" "432" ...
##  $ DP05_0038PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Black or African American" "59.9" "28.2" "30.2" ...
##  $ DP05_0038PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Black or African American" "3.5" "10.0" "6.4" ...
##  $ DP05_0039E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native" "25" "0" "30" ...
##  $ DP05_0039M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native" "24" "12" "33" ...
##  $ DP05_0039PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native" "0.4" "0.0" "0.5" ...
##  $ DP05_0039PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native" "0.3" "0.7" "0.6" ...
##  $ DP05_0040E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Cherokee tribal grouping" "0" "0" "0" ...
##  $ DP05_0040M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Cherokee tribal grouping" "17" "12" "17" ...
##  $ DP05_0040PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Cherokee tribal grouping" "0.0" "0.0" "0.0" ...
##  $ DP05_0040PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Cherokee tribal grouping" "0.5" "0.7" "0.6" ...
##  $ DP05_0041E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Chippewa tribal grouping" "0" "0" "0" ...
##  $ DP05_0041M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Chippewa tribal grouping" "17" "12" "17" ...
##  $ DP05_0041PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Chippewa tribal grouping" "0.0" "0.0" "0.0" ...
##  $ DP05_0041PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Chippewa tribal grouping" "0.5" "0.7" "0.6" ...
##  $ DP05_0042E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Navajo tribal grouping" "0" "0" "0" ...
##  $ DP05_0042M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Navajo tribal grouping" "17" "12" "17" ...
##  $ DP05_0042PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Navajo tribal grouping" "0.0" "0.0" "0.0" ...
##  $ DP05_0042PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Navajo tribal grouping" "0.5" "0.7" "0.6" ...
##  $ DP05_0043E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Sioux tribal grouping" "0" "0" "0" ...
##  $ DP05_0043M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Sioux tribal grouping" "17" "12" "17" ...
##  $ DP05_0043PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Sioux tribal grouping" "0.0" "0.0" "0.0" ...
##  $ DP05_0043PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!American Indian and Alaska Native!!Sioux tribal grouping" "0.5" "0.7" "0.6" ...
##  $ DP05_0044E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian" "125" "104" "226" ...
##  $ DP05_0044M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian" "51" "87" "155" ...
##  $ DP05_0044PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian" "1.8" "2.3" "4.0" ...
##  $ DP05_0044PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian" "0.7" "2.0" "2.7" ...
##  $ DP05_0045E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Asian Indian" "35" "40" "20" ...
##  $ DP05_0045M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Asian Indian" "31" "64" "31" ...
##  $ DP05_0045PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Asian Indian" "0.5" "0.9" "0.4" ...
##  $ DP05_0045PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Asian Indian" "0.4" "1.4" "0.5" ...
##  $ DP05_0046E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Chinese" "54" "0" "171" ...
##  $ DP05_0046M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Chinese" "46" "12" "142" ...
##  $ DP05_0046PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Chinese" "0.8" "0.0" "3.0" ...
##  $ DP05_0046PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Chinese" "0.6" "0.7" "2.5" ...
##  $ DP05_0047E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Filipino" "0" "0" "23" ...
##  $ DP05_0047M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Filipino" "17" "12" "36" ...
##  $ DP05_0047PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Filipino" "0.0" "0.0" "0.4" ...
##  $ DP05_0047PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Filipino" "0.5" "0.7" "0.6" ...
##  $ DP05_0048E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Japanese" "0" "40" "0" ...
##  $ DP05_0048M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Japanese" "17" "55" "17" ...
##  $ DP05_0048PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Japanese" "0.0" "0.9" "0.0" ...
##  $ DP05_0048PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Japanese" "0.5" "1.2" "0.6" ...
##  $ DP05_0049E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Korean" "4" "0" "0" ...
##  $ DP05_0049M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Korean" "7" "12" "17" ...
##  $ DP05_0049PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Korean" "0.1" "0.0" "0.0" ...
##  $ DP05_0049PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Korean" "0.1" "0.7" "0.6" ...
##  $ DP05_0050E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Vietnamese" "0" "0" "12" ...
##  $ DP05_0050M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Vietnamese" "17" "12" "19" ...
##  $ DP05_0050PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Vietnamese" "0.0" "0.0" "0.2" ...
##  $ DP05_0050PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Vietnamese" "0.5" "0.7" "0.3" ...
##  $ DP05_0051E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Asian!!Other Asian" "32" "24" "0" ...
##  $ DP05_0051M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Asian!!Other Asian" "30" "45" "17" ...
##  $ DP05_0051PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Asian!!Other Asian" "0.5" "0.5" "0.0" ...
##  $ DP05_0051PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Asian!!Other Asian" "0.4" "1.0" "0.6" ...
##  $ DP05_0052E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander" "0" "0" "0" ...
##  $ DP05_0052M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander" "17" "12" "17" ...
##  $ DP05_0052PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander" "0.0" "0.0" "0.0" ...
##  $ DP05_0052PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander" "0.5" "0.7" "0.6" ...
##  $ DP05_0053E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Native Hawaiian" "0" "0" "0" ...
##  $ DP05_0053M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Native Hawaiian" "17" "12" "17" ...
##  $ DP05_0053PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Native Hawaiian" "0.0" "0.0" "0.0" ...
##  $ DP05_0053PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Native Hawaiian" "0.5" "0.7" "0.6" ...
##  $ DP05_0054E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Guamanian or Chamorro" "0" "0" "0" ...
##  $ DP05_0054M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Guamanian or Chamorro" "17" "12" "17" ...
##  $ DP05_0054PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Guamanian or Chamorro" "0.0" "0.0" "0.0" ...
##  $ DP05_0054PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Guamanian or Chamorro" "0.5" "0.7" "0.6" ...
##  $ DP05_0055E : chr [1:2168] "Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Samoan" "0" "0" "0" ...
##  $ DP05_0055M : chr [1:2168] "Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Samoan" "17" "12" "17" ...
##  $ DP05_0055PE: chr [1:2168] "Percent Estimate!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Samoan" "0.0" "0.0" "0.0" ...
##  $ DP05_0055PM: chr [1:2168] "Percent Margin of Error!!RACE!!Total population!!One race!!Native Hawaiian and Other Pacific Islander!!Samoan" "0.5" "0.7" "0.6" ...
##   [list output truncated]
##  - attr(*, "spec")=
##   .. cols(
##   ..   GEO_ID = col_character(),
##   ..   NAME = col_character(),
##   ..   DP05_0031PM = col_character(),
##   ..   DP05_0032E = col_character(),
##   ..   DP05_0032M = col_character(),
##   ..   DP05_0032PE = col_character(),
##   ..   DP05_0032PM = col_character(),
##   ..   DP05_0033E = col_character(),
##   ..   DP05_0033M = col_character(),
##   ..   DP05_0033PE = col_character(),
##   ..   DP05_0033PM = col_character(),
##   ..   DP05_0034E = col_character(),
##   ..   DP05_0034M = col_character(),
##   ..   DP05_0034PE = col_character(),
##   ..   DP05_0034PM = col_character(),
##   ..   DP05_0035E = col_character(),
##   ..   DP05_0035M = col_character(),
##   ..   DP05_0035PE = col_character(),
##   ..   DP05_0035PM = col_character(),
##   ..   DP05_0036E = col_character(),
##   ..   DP05_0036M = col_character(),
##   ..   DP05_0036PE = col_character(),
##   ..   DP05_0036PM = col_character(),
##   ..   DP05_0037E = col_character(),
##   ..   DP05_0037M = col_character(),
##   ..   DP05_0037PE = col_character(),
##   ..   DP05_0037PM = col_character(),
##   ..   DP05_0038E = col_character(),
##   ..   DP05_0038M = col_character(),
##   ..   DP05_0038PE = col_character(),
##   ..   DP05_0038PM = col_character(),
##   ..   DP05_0039E = col_character(),
##   ..   DP05_0039M = col_character(),
##   ..   DP05_0039PE = col_character(),
##   ..   DP05_0039PM = col_character(),
##   ..   DP05_0040E = col_character(),
##   ..   DP05_0040M = col_character(),
##   ..   DP05_0040PE = col_character(),
##   ..   DP05_0040PM = col_character(),
##   ..   DP05_0041E = col_character(),
##   ..   DP05_0041M = col_character(),
##   ..   DP05_0041PE = col_character(),
##   ..   DP05_0041PM = col_character(),
##   ..   DP05_0042E = col_character(),
##   ..   DP05_0042M = col_character(),
##   ..   DP05_0042PE = col_character(),
##   ..   DP05_0042PM = col_character(),
##   ..   DP05_0043E = col_character(),
##   ..   DP05_0043M = col_character(),
##   ..   DP05_0043PE = col_character(),
##   ..   DP05_0043PM = col_character(),
##   ..   DP05_0044E = col_character(),
##   ..   DP05_0044M = col_character(),
##   ..   DP05_0044PE = col_character(),
##   ..   DP05_0044PM = col_character(),
##   ..   DP05_0045E = col_character(),
##   ..   DP05_0045M = col_character(),
##   ..   DP05_0045PE = col_character(),
##   ..   DP05_0045PM = col_character(),
##   ..   DP05_0046E = col_character(),
##   ..   DP05_0046M = col_character(),
##   ..   DP05_0046PE = col_character(),
##   ..   DP05_0046PM = col_character(),
##   ..   DP05_0047E = col_character(),
##   ..   DP05_0047M = col_character(),
##   ..   DP05_0047PE = col_character(),
##   ..   DP05_0047PM = col_character(),
##   ..   DP05_0048E = col_character(),
##   ..   DP05_0048M = col_character(),
##   ..   DP05_0048PE = col_character(),
##   ..   DP05_0048PM = col_character(),
##   ..   DP05_0049E = col_character(),
##   ..   DP05_0049M = col_character(),
##   ..   DP05_0049PE = col_character(),
##   ..   DP05_0049PM = col_character(),
##   ..   DP05_0050E = col_character(),
##   ..   DP05_0050M = col_character(),
##   ..   DP05_0050PE = col_character(),
##   ..   DP05_0050PM = col_character(),
##   ..   DP05_0051E = col_character(),
##   ..   DP05_0051M = col_character(),
##   ..   DP05_0051PE = col_character(),
##   ..   DP05_0051PM = col_character(),
##   ..   DP05_0052E = col_character(),
##   ..   DP05_0052M = col_character(),
##   ..   DP05_0052PE = col_character(),
##   ..   DP05_0052PM = col_character(),
##   ..   DP05_0053E = col_character(),
##   ..   DP05_0053M = col_character(),
##   ..   DP05_0053PE = col_character(),
##   ..   DP05_0053PM = col_character(),
##   ..   DP05_0054E = col_character(),
##   ..   DP05_0054M = col_character(),
##   ..   DP05_0054PE = col_character(),
##   ..   DP05_0054PM = col_character(),
##   ..   DP05_0055E = col_character(),
##   ..   DP05_0055M = col_character(),
##   ..   DP05_0055PE = col_character(),
##   ..   DP05_0055PM = col_character(),
##   ..   DP05_0056E = col_character(),
##   ..   DP05_0056M = col_character(),
##   ..   DP05_0056PE = col_character(),
##   ..   DP05_0056PM = col_character(),
##   ..   DP05_0057E = col_character(),
##   ..   DP05_0057M = col_character(),
##   ..   DP05_0057PE = col_character(),
##   ..   DP05_0057PM = col_character(),
##   ..   DP05_0058E = col_character(),
##   ..   DP05_0058M = col_character(),
##   ..   DP05_0058PE = col_character(),
##   ..   DP05_0058PM = col_character(),
##   ..   DP05_0059E = col_character(),
##   ..   DP05_0059M = col_character(),
##   ..   DP05_0059PE = col_character(),
##   ..   DP05_0059PM = col_character(),
##   ..   DP05_0060E = col_character(),
##   ..   DP05_0060M = col_character(),
##   ..   DP05_0060PE = col_character(),
##   ..   DP05_0060PM = col_character(),
##   ..   DP05_0061E = col_character(),
##   ..   DP05_0061M = col_character(),
##   ..   DP05_0061PE = col_character(),
##   ..   DP05_0061PM = col_character(),
##   ..   DP05_0062E = col_character(),
##   ..   DP05_0062M = col_character(),
##   ..   DP05_0062PE = col_character(),
##   ..   DP05_0062PM = col_character(),
##   ..   DP05_0063E = col_character(),
##   ..   DP05_0063M = col_character(),
##   ..   DP05_0063PE = col_character(),
##   ..   DP05_0063PM = col_character(),
##   ..   DP05_0064E = col_character(),
##   ..   DP05_0064M = col_character(),
##   ..   DP05_0064PE = col_character(),
##   ..   DP05_0064PM = col_character(),
##   ..   DP05_0065E = col_character(),
##   ..   DP05_0065M = col_character(),
##   ..   DP05_0065PE = col_character(),
##   ..   DP05_0065PM = col_character(),
##   ..   DP05_0066E = col_character(),
##   ..   DP05_0066M = col_character(),
##   ..   DP05_0066PE = col_character(),
##   ..   DP05_0066PM = col_character(),
##   ..   DP05_0067E = col_character(),
##   ..   DP05_0067M = col_character(),
##   ..   DP05_0067PE = col_character(),
##   ..   DP05_0067PM = col_character(),
##   ..   DP05_0068E = col_character(),
##   ..   DP05_0068M = col_character(),
##   ..   DP05_0068PE = col_character(),
##   ..   DP05_0068PM = col_character(),
##   ..   DP05_0069E = col_character(),
##   ..   DP05_0069M = col_character(),
##   ..   DP05_0069PE = col_character(),
##   ..   DP05_0069PM = col_character(),
##   ..   DP05_0070E = col_character(),
##   ..   DP05_0070M = col_character(),
##   ..   DP05_0070PE = col_character(),
##   ..   DP05_0070PM = col_character(),
##   ..   DP05_0071E = col_character(),
##   ..   DP05_0071M = col_character(),
##   ..   DP05_0071PE = col_character(),
##   ..   DP05_0071PM = col_character(),
##   ..   DP05_0072E = col_character(),
##   ..   DP05_0072M = col_character(),
##   ..   DP05_0072PE = col_character(),
##   ..   DP05_0072PM = col_character(),
##   ..   DP05_0073E = col_character(),
##   ..   DP05_0073M = col_character(),
##   ..   DP05_0073PE = col_character(),
##   ..   DP05_0073PM = col_character(),
##   ..   DP05_0074E = col_character(),
##   ..   DP05_0074M = col_character(),
##   ..   DP05_0074PE = col_character(),
##   ..   DP05_0074PM = col_character(),
##   ..   DP05_0075E = col_character(),
##   ..   DP05_0075M = col_character(),
##   ..   DP05_0075PE = col_character(),
##   ..   DP05_0075PM = col_character(),
##   ..   DP05_0076E = col_character(),
##   ..   DP05_0076M = col_character(),
##   ..   DP05_0076PE = col_character(),
##   ..   DP05_0076PM = col_character(),
##   ..   DP05_0077E = col_character(),
##   ..   DP05_0077M = col_character(),
##   ..   DP05_0077PE = col_character(),
##   ..   DP05_0077PM = col_character(),
##   ..   DP05_0078E = col_character(),
##   ..   DP05_0078M = col_character(),
##   ..   DP05_0078PE = col_character(),
##   ..   DP05_0078PM = col_character(),
##   ..   DP05_0079E = col_character(),
##   ..   DP05_0079M = col_character(),
##   ..   DP05_0079PE = col_character(),
##   ..   DP05_0079PM = col_character(),
##   ..   DP05_0080E = col_character(),
##   ..   DP05_0080M = col_character(),
##   ..   DP05_0080PE = col_character(),
##   ..   DP05_0080PM = col_character(),
##   ..   DP05_0081E = col_character(),
##   ..   DP05_0081M = col_character(),
##   ..   DP05_0081PE = col_character(),
##   ..   DP05_0081PM = col_character(),
##   ..   DP05_0082E = col_character(),
##   ..   DP05_0082M = col_character(),
##   ..   DP05_0082PE = col_character(),
##   ..   DP05_0082PM = col_character(),
##   ..   DP05_0083E = col_character(),
##   ..   DP05_0083M = col_character(),
##   ..   DP05_0083PE = col_character(),
##   ..   DP05_0083PM = col_character(),
##   ..   DP05_0084E = col_character(),
##   ..   DP05_0084M = col_character(),
##   ..   DP05_0084PE = col_character(),
##   ..   DP05_0084PM = col_character(),
##   ..   DP05_0085E = col_character(),
##   ..   DP05_0085M = col_character(),
##   ..   DP05_0085PE = col_character(),
##   ..   DP05_0085PM = col_character(),
##   ..   DP05_0086E = col_character(),
##   ..   DP05_0086M = col_character(),
##   ..   DP05_0086PE = col_character(),
##   ..   DP05_0086PM = col_character(),
##   ..   DP05_0087E = col_character(),
##   ..   DP05_0087M = col_character(),
##   ..   DP05_0087PE = col_character(),
##   ..   DP05_0087PM = col_character(),
##   ..   DP05_0088E = col_character(),
##   ..   DP05_0088M = col_character(),
##   ..   DP05_0088PE = col_character(),
##   ..   DP05_0088PM = col_character(),
##   ..   DP05_0089E = col_character(),
##   ..   DP05_0089M = col_character(),
##   ..   DP05_0089PE = col_character(),
##   ..   DP05_0089PM = col_character(),
##   ..   DP05_0001E = col_character(),
##   ..   DP05_0001M = col_character(),
##   ..   DP05_0001PE = col_character(),
##   ..   DP05_0001PM = col_character(),
##   ..   DP05_0002E = col_character(),
##   ..   DP05_0002M = col_character(),
##   ..   DP05_0002PE = col_character(),
##   ..   DP05_0002PM = col_character(),
##   ..   DP05_0003E = col_character(),
##   ..   DP05_0003M = col_character(),
##   ..   DP05_0003PE = col_character(),
##   ..   DP05_0003PM = col_character(),
##   ..   DP05_0004E = col_character(),
##   ..   DP05_0004M = col_character(),
##   ..   DP05_0004PE = col_character(),
##   ..   DP05_0004PM = col_character(),
##   ..   DP05_0005E = col_character(),
##   ..   DP05_0005M = col_character(),
##   ..   DP05_0005PE = col_character(),
##   ..   DP05_0005PM = col_character(),
##   ..   DP05_0006E = col_character(),
##   ..   DP05_0006M = col_character(),
##   ..   DP05_0006PE = col_character(),
##   ..   DP05_0006PM = col_character(),
##   ..   DP05_0007E = col_character(),
##   ..   DP05_0007M = col_character(),
##   ..   DP05_0007PE = col_character(),
##   ..   DP05_0007PM = col_character(),
##   ..   DP05_0008E = col_character(),
##   ..   DP05_0008M = col_character(),
##   ..   DP05_0008PE = col_character(),
##   ..   DP05_0008PM = col_character(),
##   ..   DP05_0009E = col_character(),
##   ..   DP05_0009M = col_character(),
##   ..   DP05_0009PE = col_character(),
##   ..   DP05_0009PM = col_character(),
##   ..   DP05_0010E = col_character(),
##   ..   DP05_0010M = col_character(),
##   ..   DP05_0010PE = col_character(),
##   ..   DP05_0010PM = col_character(),
##   ..   DP05_0011E = col_character(),
##   ..   DP05_0011M = col_character(),
##   ..   DP05_0011PE = col_character(),
##   ..   DP05_0011PM = col_character(),
##   ..   DP05_0012E = col_character(),
##   ..   DP05_0012M = col_character(),
##   ..   DP05_0012PE = col_character(),
##   ..   DP05_0012PM = col_character(),
##   ..   DP05_0013E = col_character(),
##   ..   DP05_0013M = col_character(),
##   ..   DP05_0013PE = col_character(),
##   ..   DP05_0013PM = col_character(),
##   ..   DP05_0014E = col_character(),
##   ..   DP05_0014M = col_character(),
##   ..   DP05_0014PE = col_character(),
##   ..   DP05_0014PM = col_character(),
##   ..   DP05_0015E = col_character(),
##   ..   DP05_0015M = col_character(),
##   ..   DP05_0015PE = col_character(),
##   ..   DP05_0015PM = col_character(),
##   ..   DP05_0016E = col_character(),
##   ..   DP05_0016M = col_character(),
##   ..   DP05_0016PE = col_character(),
##   ..   DP05_0016PM = col_character(),
##   ..   DP05_0017E = col_character(),
##   ..   DP05_0017M = col_character(),
##   ..   DP05_0017PE = col_character(),
##   ..   DP05_0017PM = col_character(),
##   ..   DP05_0018E = col_character(),
##   ..   DP05_0018M = col_character(),
##   ..   DP05_0018PE = col_character(),
##   ..   DP05_0018PM = col_character(),
##   ..   DP05_0019E = col_character(),
##   ..   DP05_0019M = col_character(),
##   ..   DP05_0019PE = col_character(),
##   ..   DP05_0019PM = col_character(),
##   ..   DP05_0020E = col_character(),
##   ..   DP05_0020M = col_character(),
##   ..   DP05_0020PE = col_character(),
##   ..   DP05_0020PM = col_character(),
##   ..   DP05_0021E = col_character(),
##   ..   DP05_0021M = col_character(),
##   ..   DP05_0021PE = col_character(),
##   ..   DP05_0021PM = col_character(),
##   ..   DP05_0022E = col_character(),
##   ..   DP05_0022M = col_character(),
##   ..   DP05_0022PE = col_character(),
##   ..   DP05_0022PM = col_character(),
##   ..   DP05_0023E = col_character(),
##   ..   DP05_0023M = col_character(),
##   ..   DP05_0023PE = col_character(),
##   ..   DP05_0023PM = col_character(),
##   ..   DP05_0024E = col_character(),
##   ..   DP05_0024M = col_character(),
##   ..   DP05_0024PE = col_character(),
##   ..   DP05_0024PM = col_character(),
##   ..   DP05_0025E = col_character(),
##   ..   DP05_0025M = col_character(),
##   ..   DP05_0025PE = col_character(),
##   ..   DP05_0025PM = col_character(),
##   ..   DP05_0026E = col_character(),
##   ..   DP05_0026M = col_character(),
##   ..   DP05_0026PE = col_character(),
##   ..   DP05_0026PM = col_character(),
##   ..   DP05_0027E = col_character(),
##   ..   DP05_0027M = col_character(),
##   ..   DP05_0027PE = col_character(),
##   ..   DP05_0027PM = col_character(),
##   ..   DP05_0028E = col_character(),
##   ..   DP05_0028M = col_character(),
##   ..   DP05_0028PE = col_character(),
##   ..   DP05_0028PM = col_character(),
##   ..   DP05_0029E = col_character(),
##   ..   DP05_0029M = col_character(),
##   ..   DP05_0029PE = col_character(),
##   ..   DP05_0029PM = col_character(),
##   ..   DP05_0030E = col_character(),
##   ..   DP05_0030M = col_character(),
##   ..   DP05_0030PE = col_character(),
##   ..   DP05_0030PM = col_character(),
##   ..   DP05_0031E = col_character(),
##   ..   DP05_0031M = col_character(),
##   ..   DP05_0031PE = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>
library(dplyr)
library(stringr)

acs_clean <- ACS_data %>%
  slice(-1) %>% # Remove the description row
  mutate(
    
    GEOID = sub("1400000US", "", GEO_ID),
    
    total_pop   = as.numeric(DP05_0001E),  # Total Population
    elderly_pop = as.numeric(DP05_0019E),  # 65 years and over
    white_pop   = as.numeric(DP05_0037E),  # Race: White
    black_pop   = as.numeric(DP05_0038E),  # Race: Black
    hisp_pop    = as.numeric(DP05_0071E)   # Ethnicity: Hispanic
  ) %>%
  
  filter(substr(GEOID, 3, 5) %in% c("005", "047", "061", "081", "085")) %>%
  # 4. Keep only the necessary columns
  select(GEOID, total_pop, elderly_pop, white_pop, black_pop, hisp_pop)

glimpse(acs_clean)
## Rows: 2,167
## Columns: 6
## $ GEOID       <chr> "36005000100", "36005000200", "36005000400", "36005001600"…
## $ total_pop   <dbl> 7080, 4542, 5634, 5917, 2765, 9409, 4600, 172, 5887, 2868,…
## $ elderly_pop <dbl> 171, 960, 1127, 1501, 757, 2558, 1102, 41, 1650, 1020, 155…
## $ white_pop   <dbl> 1773, 2165, 2623, 2406, 585, 3185, 479, 69, 903, 243, 480,…
## $ black_pop   <dbl> 4239, 1279, 1699, 2434, 1041, 4487, 2122, 89, 1344, 987, 2…
## $ hisp_pop    <dbl> 2329, 3367, 3873, 3603, 1413, 5905, 2674, 0, 4562, 1985, 2…
nyc_tracts_sf <- st_read("~/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/2010 Census Tracts/geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a.shp")
## Reading layer `geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a' from data source `/Users/emilycoty/Desktop/SPRING 2026 HUNTER/Programming with R/Week 8/Section_08/R-Spatial_II_Lab/2010 Census Tracts/geo_export_1dc7b645-647b-4806-b9a0-7b79660f120a.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 2165 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -74.25559 ymin: 40.49612 xmax: -73.70001 ymax: 40.91553
## Geodetic CRS:  WGS84(DD)
str(nyc_tracts_sf)
## Classes 'sf' and 'data.frame':   2165 obs. of  12 variables:
##  $ boro_code : chr  "5" "1" "1" "1" ...
##  $ boro_ct201: chr  "5000900" "1009800" "1010000" "1010200" ...
##  $ boro_name : chr  "Staten Island" "Manhattan" "Manhattan" "Manhattan" ...
##  $ cdeligibil: chr  "E" "I" "I" "I" ...
##  $ ct2010    : chr  "000900" "009800" "010000" "010200" ...
##  $ ctlabel   : chr  "9" "98" "100" "102" ...
##  $ ntacode   : chr  "SI22" "MN19" "MN19" "MN17" ...
##  $ ntaname   : chr  "West New Brighton-New Brighton-St. George" "Turtle Bay-East Midtown" "Turtle Bay-East Midtown" "Midtown-Midtown South" ...
##  $ puma      : chr  "3903" "3808" "3808" "3807" ...
##  $ shape_area: num  2497010 1906016 1860938 1860993 1864600 ...
##  $ shape_leng: num  7729 5534 5692 5688 5693 ...
##  $ geometry  :sfc_MULTIPOLYGON of length 2165; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:28, 1:2] -74.1 -74.1 -74.1 -74.1 -74.1 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:11] "boro_code" "boro_ct201" "boro_name" "cdeligibil" ...
nyc_tracts_sf <- nyc_tracts_sf %>%
  rename(GEOID = ct2010) %>%
  mutate(GEOID = as.character(GEOID))

nyc_tracts_fixed <- nyc_tracts_sf %>%
  mutate(
    county_code = case_when(
      boro_code == "1" ~ "061", # Manhattan
      boro_code == "2" ~ "005", # Bronx
      boro_code == "3" ~ "047", # Brooklyn
      boro_code == "4" ~ "081", # Queens
      boro_code == "5" ~ "085", # Staten Island
    ),
    GEOID_Full = paste0("36", county_code, boro_ct201 %>% str_remove("^\\d"))
  )

tracts_with_acs <- nyc_tracts_fixed %>%
  left_join(acs_clean, by = c("GEOID_Full" = "GEOID"))

str(tracts_with_acs)
## Classes 'sf' and 'data.frame':   2165 obs. of  19 variables:
##  $ boro_code  : chr  "5" "1" "1" "1" ...
##  $ boro_ct201 : chr  "5000900" "1009800" "1010000" "1010200" ...
##  $ boro_name  : chr  "Staten Island" "Manhattan" "Manhattan" "Manhattan" ...
##  $ cdeligibil : chr  "E" "I" "I" "I" ...
##  $ GEOID      : chr  "000900" "009800" "010000" "010200" ...
##  $ ctlabel    : chr  "9" "98" "100" "102" ...
##  $ ntacode    : chr  "SI22" "MN19" "MN19" "MN17" ...
##  $ ntaname    : chr  "West New Brighton-New Brighton-St. George" "Turtle Bay-East Midtown" "Turtle Bay-East Midtown" "Midtown-Midtown South" ...
##  $ puma       : chr  "3903" "3808" "3808" "3807" ...
##  $ shape_area : num  2497010 1906016 1860938 1860993 1864600 ...
##  $ shape_leng : num  7729 5534 5692 5688 5693 ...
##  $ county_code: chr  "085" "061" "061" "061" ...
##  $ GEOID_Full : chr  "36085000900" "36061009800" "36061010000" "36061010200" ...
##  $ total_pop  : num  1826 7200 1768 100 919 ...
##  $ elderly_pop: num  509 632 120 17 43 ...
##  $ white_pop  : num  620 5983 1401 64 647 ...
##  $ black_pop  : num  861 144 35 0 22 26 9 13 78 11 ...
##  $ hisp_pop   : num  445 424 61 11 103 0 81 184 476 249 ...
##  $ geometry   :sfc_MULTIPOLYGON of length 2165; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:28, 1:2] -74.1 -74.1 -74.1 -74.1 -74.1 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  - attr(*, "sf_column")= chr "geometry"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "names")= chr [1:18] "boro_code" "boro_ct201" "boro_name" "cdeligibil" ...

task 5:Aggregate the ACS census data to zip code area data.

### task 5: Aggregate the ACS census data to zip code area data.

library(dplyr)
library(sf)


# 1. Project both layers to the NYC State Plane (Feet) for accuracy
tracts_final_proj <- st_transform(tracts_with_acs, 2263)
zips_final_proj   <- st_transform(nyc_zipcode, 2263)

# 2. Assign Tracts to ZIPs and Sum the Totals
zip_demographics <- tracts_final_proj %>%
  st_centroid() %>% # Convert polygon to center point
  st_join(zips_final_proj, join = st_within) %>%
  st_drop_geometry() %>%
  group_by(ZIPCODE) %>%
  summarise(
    total_pop_zip   = sum(total_pop, na.rm = TRUE),
    elderly_pop_zip = sum(elderly_pop, na.rm = TRUE),
    white_pop_zip   = sum(white_pop, na.rm = TRUE),
    black_pop_zip   = sum(black_pop, na.rm = TRUE),
    hisp_pop_zip    = sum(hisp_pop, na.rm = TRUE)
  )
## Warning: st_centroid assumes attributes are constant over geometries
# 3. Master Join: Attach these sums to your existing COVID/Food map object
# Note: Ensure ZIPCODE column names match exactly
final_map_sf <- covid_food_hf %>%
  mutate("ZIPCODE" = as.character("ZIPCODE")) %>%
  left_join(zip_demographics, by = "ZIPCODE")

# 4. Create "Percentage" variables for more accurate mapping
final_map_sf <- final_map_sf %>%
  mutate(
    pct_elderly = (elderly_pop_zip / total_pop_zip) * 100,
    pct_black   = (black_pop_zip / total_pop_zip) * 100
  )

zip_data_only <- final_map_sf %>%
  st_drop_geometry() %>%
  distinct("ZIPCODE", .keep_all = TRUE)

map_data_final <- nyc_zipcode %>%
  mutate("ZIPCODE" = as.character("ZIPCODE")) %>%
  left_join(zip_data_only, by = "ZIPCODE")

head(map_data_final %>% select(ZIPCODE, Positive, pct_elderly))
## Simple feature collection with 6 features and 3 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 986490.1 ymin: 168910.5 xmax: 1043042 ymax: 189382.9
## Projected CRS: NAD83 / New York Long Island (ftUS)
##   ZIPCODE Positive pct_elderly                       geometry
## 1 ZIPCODE      539          NA POLYGON ((1038098 188138.4,...
## 2 ZIPCODE      539          NA POLYGON ((1001614 186926.4,...
## 3 ZIPCODE      539          NA POLYGON ((1011174 183696.3,...
## 4 ZIPCODE      539          NA POLYGON ((995908.4 183617.6...
## 5 ZIPCODE      539          NA POLYGON ((991997.1 176307.5...
## 6 ZIPCODE      539          NA POLYGON ((994821.5 177865.7...
save(map_data_final, file = "map_data_final.RData")