Советы по устранению ошибок 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()
отлично работает здесь.