代码之家  ›  专栏  ›  技术社区  ›  dca

使用通过tidyconsenses下载的数据发现dotsinpolys长度不匹配

  •  0
  • dca  · 技术社区  · 7 年前

    你能帮助找出解决dotsinpolys引发的长度不匹配错误的最佳方法吗?我认为这是因为多边形数据中存在na's或nulls或某些funk,这使得它太长。这是复制错误的代码。最后,我想用传单绘制多个种族,但是我不能生成随机点所需的lat/lon。

    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
    

    这篇文章( Advice on troubleshooting dotsInPolys error (maptools) )我差点就要帮我了,但我不知道如何把它应用到我的案件中。

    我可以更改nj空间多边形数据帧的长度,方法是删除na's和黑色pop大于0的县,但地图不会绘制多个县(可能是人口普查下载有问题?).

    1 回复  |  直到 7 年前
        1
  •  1
  •   mfherman    7 年前

    看起来你可能已经弄明白了,但我想分享另一种方法 sf::st_sample() 而不是 maptools::dotsInPolys() . 这样做的一个好处是不需要转换 sf 从中获得的对象 tidycensus 到A sp 对象。

    在下面的示例中,我将人口普查数据按种族划分为列表3 SF 然后执行对象 st_sample() 在列表的每个元素上(每个种族)。接下来,我将采样点重新组合成一个 SF 对象,每个点都有一个新的种族变量。最后,我用 tmap 做一张地图,尽管你可以用 ggplot2 leaflet 也可以绘制地图。

    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")
    

    我没有足够的代表来直接发布地图图像, but here it is .

    推荐文章