Советы по устранению ошибок dotsInPolys (maptools)

Я довольно новичок в R и я все еще изучаю некоторые способы устранения проблем, с которыми я сталкиваюсь. Я сталкиваюсь с тем, на котором я застрял и задавался вопросом, есть ли у кого-нибудь предложения.

Я пытаюсь построить карту плотности точек, но у меня возникает ошибка с dotsInPolys функция. Линия:

scc.rand <- dotsInPolys(sccpolys, as.integer(plotvar), f="random")

Что дает мне ошибку:

> sccdots.rand <- dotsInPolys(sccpolys, as.integer(plotvar), f="random")
Error in dotsInPolys(sccpolys, as.integer(plotvar), f = "random") : 
  different lengths

В документации указано, что sccpolys а также plotvar должны быть одинаковой длины, но я не уверен, как перепроверить это, или, что более важно, исправить проблему. У кого-нибудь есть рекомендации как можно проверить что не так? Спасибо заранее

Вот весь набор кода, над которым я работаю:

library(maptools)

# Population data
sccpop <- read.csv("nhgis0010_ds98_1970_tract.csv", stringsAsFactors = FALSE)
sccpop.sub <- sccpop[sccpop$COUNTY=="Santa Clara",c(1,3,21,22,23)]

# Shapefile for Census tracts
scctract.shp <- readShapePoly("1970-ca-tracts.shp")
sccpolys <- SpatialPolygonsDataFrame(scctract.shp, data=as(scctract.shp, "data.frame"))

# Merge datasets
sccdata <- merge(sccpolys@data, sccpop.sub, sort=FALSE)
plotvar <- sccdata$C0X001 / 1000 # one dot per 1,000 people
head(sccpolys@data)
head(sccpop.sub)

# Generate random dots in polygons
sccdots.rand <- dotsInPolys(sccpolys, as.integer(plotvar), f="random")

# County boundaries
baycounties.shp <- readShapePoly("ca-counties-1970.shp")
baycounties <- SpatialPolygonsDataFrame(baycounties.shp, data=as(baycounties.shp, "data.frame"))

par(mar=c(0,0,0,0))
plot(baycounties, lwd=0.1)

# Add dots
plot(sccdots.rand, add=TRUE, pch=19, cex=0.1, col="#00880030")

2 ответа

Решение

@LincolnMullen прав. После вашего слияния у вас есть:

> length(sccpolys)
[1] 787

а также

> length(plotvar)
[1] 210

Чтобы учесть это, вы можете заменить

sccdots.rand <- dotsInPolys(sccpolys, as.integer(plotvar), f="random")

с

sccdots.rand <- dotsInPolys(sccpolys[sccpolys$GISJOIN %in% sccdata$GISJOIN,], as.integer(plotvar), f="random")

Проблема в том, что у вас больше участков (то есть полигонов в вашем шейп-файле), чем вы хотите построить. Есть 787 тракты и только 210 участки в Санта-Кларе. Кроме того, есть некоторые манипуляции с @data слот в SpatialPolygonsDataFrame в этом нет необходимости. Вот решение, которое очищает код слияния.

library(maptools)

shp <- readShapePoly("1970-ca-tracts.shp")
sccpop <- read.csv("nhgis0010_ds98_1970_tract.csv", stringsAsFactors = FALSE)
sccpop.sub <- sccpop[sccpop$COUNTY=="Santa Clara",c(1,3,21,22,23)]

shp <- merge(shp, sccpop.sub)

Теперь у нас есть SpatialPolygonsDataFrame с данными, но есть пропущенные значения для всех округов не Санта-Клара. И мы хотим преобразовать население, как вы сделали выше. Первая строка ниже выполняет преобразование, добавляя столбец во фрейм данных. Проще всего сохранить это внутри фрейма данных, а не как внешнюю переменную. Вторая строка отфильтровывает все полигоны, с которыми не связано население, то есть округа, не относящиеся к Санта-Кларе.

shp@data$plotvar <- as.integer(shp@data$C0X001 / 1000)
shp <- shp[!is.na(shp@data$plotvar), ]

Теперь мы можем продолжить, как вы делали раньше.

sccdots.rand <- dotsInPolys(shp, shp@data$plotvar, f="random")

baycounties.shp <- readShapePoly("ca-counties-1970.shp")

par(mar=c(0,0,0,0))
plot(baycounties.shp, lwd=0.1)
plot(sccdots.rand, add=TRUE, pch=19, cex=0.1, col="#00880030")

Итоговый сюжет

FWIW, у меня были лучшие результаты, используя rgdal::readOGR() для загрузки шейп-файлов, но maptools::readShapePoly() отлично работает здесь.

Другие вопросы по тегам