0

您能否帮助找出解决 dotsInPolys 引发的长度不匹配错误的最佳方法?我认为这是因为多边形数据中有 NA 或 NULL 或一些 funk 使得它太长。这是重现错误的代码。最终,我想使用 Leaflet 绘制多个种族,但此时我无法生成随机点所需的纬度/经度。

require(maptools)
require(tidycensus)

person.number.divider <- 1000

census_api_key("ENTER KEY HERE", install = TRUE)

racevars <- c(White = "B02001_002", #"P005003" 
              Black = "B02001_003", #Black or African American alone
              Latinx = "B03001_003"
)

nj.county <- get_acs(geography = "county", #tract
              year = 2015,
              variables = racevars,
              state = "NJ", #county = "Harris County",
              geometry = TRUE,
              summary_var = "B02001_001")

library(sf)
st_write(nj.county, "nj.county.shp", delete_layer = TRUE)

nj <- rgdal::readOGR(dsn = "nj.county.shp") %>%
  spTransform(CRS("+proj=longlat +datum=WGS84"))

nj@data <- nj@data %>% 
  tidyr::separate(NAME,
                  sep =",",
                  into = c("county", "state"))  %>%
  dplyr::select(estimat,variabl, GEOID, county) %>%
  spread(key = variabl, value = estimat) %>%
  mutate(county = trimws(county))


black.dots <- dplyr::select(nj@data, Black) / person.number.divider #%>%
black.dots <-   dotsInPolys(nj, as.integer(black.dots$Black), f="random")

# Error in dotsInPolys(nj, as.integer(black.dots$Black), f = "random") : 
# different lengths

length(nj) # 63 This seems too many, because I believe NJ has 21 counties.
length(black.dots$Black) # 21

这篇文章(关于排除 dotsInPolys 错误(maptools)的建议)几乎可以帮助我,但我不知道如何将它应用到我的案例中。

我可以通过删除 NA 和黑色弹出大于 0 的县来更改 nj spatialpolygonsdataframe 的长度,但是地图没有绘制多个县(也许人口普查下载有问题?)。

4

1 回答 1

1

看起来您可能已经弄清楚了,但我想分享另一种sf::st_sample()使用maptools::dotsInPolys(). 这样做的一个优点是您不需要将sf获得的对象转换tidycensussp对象。

在以下示例中,我按种族将人口普查数据拆分为三个sf对象列表,然后st_sample()对列表的每个元素(每个种族)执行。接下来,我将采样点重新组合成一个sf对象,每个点都有一个新的竞态变量。最后,我tmap用来制作地图,尽管您也可以使用ggplot2orleaflet来制作地图。

library(tidyverse)
library(tidycensus)
library(sf)
library(tmap)

person.number.divider <- 1000

racevars <- c(White = "B02001_002", #"P005003" 
              Black = "B02001_003", #Black or African American alone
              Latinx = "B03001_003"
              )

# get acs data with geography in "tidy" form
nj.county <- get_acs(geography = "county", #tract
                     year = 2015,
                     variables = racevars,
                     state = "NJ", #county = "Harris County",
                     geometry = TRUE,
                     summary_var = "B02001_001"
                     )

# split by race
county.split <- nj.county %>% 
  split(.$variable)

# randomly sample points in polygons based on population
points.list <- map(county.split, ~ st_sample(., .$estimate / person.number.divider))

# combine points into sf collections and add race variable 
points <- imap(points.list, ~ st_sf(tibble(race = rep(.y, length(.x))), geometry = .x)) %>% 
  reduce(rbind)

# map!
tm_shape(nj.county) +
  tm_borders(col = "darkgray", lwd = 0.5) +
  tm_shape(points) +
  tm_dots(col = "race", size = 0.01, pal = "Set2")

我没有足够的代表直接发布地图图像,但在这里

于 2018-11-20T15:30:05.160 回答