R sf st-пересечение сохранить несогласованные строки - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь создать карту, которая показывает покрытие проприетарных данных (шейп-файл). В основном, результат покажет, сколько смежных США охвачено данными. Я использовал st_intersection, но он сохраняет только «совпадающие» строки. Есть ли способ сохранить «несопоставленные» строки так, чтобы я мог указать, какая область является «NA»?

Вот воспроизводимый пример. Предположим, у меня есть подмножество карт почтовых индексов в области D C («почтовый индекс»), а остальная часть карты почтовых индексов области D C недоступна (конечно, это не так в действительности, но это проблема Я сталкиваюсь с фактическими данными). Когда я использую dc_zip, отображаются только совпадающие строки. То, что я хочу вместо этого (частично) достигается путем построения всего многоугольника D C в первую очередь и нанесения почтового индекса поверх него. Здесь я могу разделить D C на область с созданной картой почтового индекса и без карты почтового индекса. Это лучший подход?

library(USAboundaries)
library(sf)
library(dplyr)
library(tigris)
library(tmap)

dc <- USAboundaries::us_states() %>% filter(statefp == "11") %>% st_transform(crs = 4269)

zip <- tigris::zctas(starts_with = "2000", class = "sf")

dc_zip <- st_intersection(zip, dc)

tm_shape(dc_zip) + tm_polygons() # drops unmatched rows

tm_shape(dc) + tm_polygons("grey80") + tm_shape(zip) + tm_polygons("green") # keeps unmatched rows

Любые комментарии приветствуются!

1 Ответ

2 голосов
/ 02 февраля 2020

Я не совсем уверен, что вы пытаетесь сделать. Но, увидев, что вы делали, мне кажется, что вы хотите нарисовать все полигоны в области D C и назначить цвета для некоторых полигонов. Если так, то следующий способ для вас. Я пытался придерживаться пакетов, которые вы использовали, за исключением пакета tmap.

library(tigris)
library(USAboundaries)
library(sf)
library(dplyr)
library(ggplot2)

# Get DC polygon
dc <- USAboundaries::us_states() %>%
      filter(statefp == "11") %>%
      st_transform(crs = 4326)

Видя эту веб-страницу , вам, вероятно, нужно указать starts_with = "20", чтобы включить все полигоны в D C площадь. Но этого недостаточно. Таким образом, вам нужно подмножество данных.

zip <- tigris::zctas(starts_with = "20", class = "sf")

zip2 <- mutate(zip, ZCTA5CE10 = as.numeric(ZCTA5CE10)) %>% 
        filter(ZCTA5CE10 <= 20600) %>% 
        st_transform(zip, crs = 4326)

# Get polygons in the DC area
dc_zip <- st_intersection(zip2, dc)

Давайте нарисуем область D C один раз

ggplot() + geom_sf(data = dc_zip)

enter image description here

Давайте скажем, у вас есть непрерывная переменная. Значения присутствуют для 20000-20010 (ZCTA5CE10), но все другие ZCTA5CE10 имеют NA. Я создаю эту фиктивную переменную здесь. В ваших реальных данных, я думаю, что это переменная, которую вы должны указать самостоятельно.

set.seed(111)
dc_zip <- mutate(dc_zip, whatever = if_else(ZCTA5CE10 %in% 20000:20010,
                                            sample.int(1000, size = n(), replace = FALSE),
                                            NA_integer_))

Снова нарисуйте карту. Я использую whatever в качестве переменной для заполнения полигонов.

ggplot() + geom_sf(data = dc_zip, aes(fill = whatever))

enter image description here

Если вы хотите изменить цвет для областей NA, вы можете например, добавьте scale_fill_continuous(na.value = "white").

...