Удаление Великих озер с карт уровня округов США в R

Я использую R, чтобы нарисовать карту США на уровне округа. Я загрузил шейп-файл для США из GADM. Файл формы уровня округа - gadm36_USA_2.shp. Затем я использовал приведенный ниже код для рисования карты:

library(sf)
library(tidyverse)

us2 <- st_read("<Path>\\gadm36_USA_2.shp")

mainland2 <- ggplot(data = us2) +
geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
coord_sf(crs = st_crs(2163), 
         xlim = c(-2500000, 2500000), 
         ylim = c(-2300000, 730000)) + guides(fill = F)

Район Великих озер (показан красными стрелками) нанесен на график, а не оставлен пустым:  введите описание изображения здесь

Мне нужна цифра, как показано ниже, где район Великих озер оставлен пустым: введите описание изображения здесь

Как я могу определить из gadm36_USA_2.shp, какие строки соответствуют району Великих озер, чтобы я мог их удалить?

Я понимаю, что могут быть другие способы получить шейп-файл, кроме GADM. Я считаю, что GADM - отличный источник, который предоставляет финансовые ресурсы по всему миру. Я хочу воспользоваться этой возможностью, чтобы лучше ознакомиться с данными, загруженными из GADM.

Конечно, приветствуются другие методы получения данных о границах округов США. Я заметил, что пакет USAboundaries также предоставляет справочные данные на уровне страны, штата и округа, но у меня возникают трудности с установкой связанного пакета USAboundariesData. Приветствуется любая идея нарисовать округа США другими способами, кроме шейп-файла из GADM. Спасибо.


person Patrick    schedule 30.11.2019    source источник


Ответы (1)


Один из способов - удалить каждую функцию, помеченную знаком Lake в существующих записях (в настоящее время 13 функций). Во-первых, вам нужно найти название озера в таблице атрибутов, как показано ниже:

# retrieving the name of lakes and excluding them from the sf 

all.names = us2$NAME_2
patterns = c("Lake", "lake")

lakes.name <- unique(grep(paste(patterns, collapse="|"), all.names, value=TRUE, ignore.case = TRUE))
#[1] "Lake and Peninsula" "Lake"               "Bear Lake"          "Lake Michigan"      "Lake Hurron"        "Lake St. Clair"    
#[7] "Lake Superior"      "Lake of the Woods"  "Red Lake"           "Lake Ontario"       "Lake Erie"          "Salt Lake"         
#[13] "Green Lake" 

`%notin%` <- Negate(`%in%`)
us <- us2[us2$NAME_2 %notin% lakes.name, ]

Затем вы можете сопоставить оставшиеся функции:

mainland2 <- ggplot(data = us) +
  geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
  coord_sf(crs = st_crs(2163), 
           xlim = c(-2500000, 2500000), 
           ylim = c(-2300000, 730000)) + guides(fill = F)
mainland2

введите здесь описание изображения

Другой способ (гораздо более простой, но менее гибкий) - отобразить объекты округа, исключив значения Water body из ENGTYPE_2, как показано ниже:

us <- us2[(us2$ENGTYPE_2) != "Water body",]
mainland2 <- ggplot(data = us) +
  geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
  coord_sf(crs = st_crs(2163), 
           xlim = c(-2500000, 2500000), 
           ylim = c(-2300000, 730000)) + guides(fill = F)
mainland2

введите здесь описание изображения

person Majid    schedule 30.11.2019
comment
Почему, следуя второму методу, отсутствует штат Луизиана? - person Patrick; 30.11.2019
comment
Потому что по некоторым причинам County в состоянии помечен тегом Parish. Обходите это, очищая данные с помощью us2[(us2$NAME_1) == "Louisiana",]$ENGTYPE_2 <- "County" или us <- us2[(us2$ENGTYPE_2) != "Water body",]. Я изменил свой сценарий на последний вариант. - person Majid; 01.12.2019
comment
Спасибо @Majid. У меня есть новое сообщение (stackoverflow.com/questions/59117165/) по соответствующему вопросу. Пожалуйста, посмотрите, если у вас есть интерес. Еще раз спасибо. - person Patrick; 01.12.2019