Как найти другие zipcodes, которые касаются определенного почтового индекса?

Я хочу создать матрицу около 200 zipcodes и соседних zipcodes, которые касаются этих zipcodes. Матрица будет 200 * 200 с 1 для ячеек, в которых два zipcodes касаются и 0, когда они не являются соседними zip-кодами.

Как я мог создать или получить такую ​​матрицу? Большое вам спасибо.

Бест,

Ответ 1

Если у вас есть доступ к шейп файлу, это относительно просто с помощью пакета spdep.

Вот отдельный пример использования калифорнийских данных почтового индекса (~ 3,5 МБ загрузки):

# load libraries
library(rgdal)
library(spdep)

# download, unzip and import shapefile
download.file('http://geocommons.com/overlays/305142.zip', {f<-tempfile()})
unzip(f, exdir=tempdir())
shp <- readOGR(tempdir(), 'tigerline_shapefile_2010_2010_state_california_2010_census_5-digit_zip_code_tabulation_area_zcta5_state-based')

# identify neighbours for each poly
nbs <- setNames(poly2nb(shp), shp$ZCTA5CE10)

# convert to a binary neighbour matrix
nbs.mat <- nb2mat(nbs, zero.policy=TRUE, style='B')

# see?rgeos::gTouches for an alternative to the above steps

# assign zip codes as dimension names
dimnames(nbs.mat) <- list(shp$ZCTA5CE10, shp$ZCTA5CE10)

Для нашего набора данных это возвращает матрицу 1769 x 1769, указывающую, какие почтовые индексы являются соседями. Первые 10 строк и 10 столбцов выглядят следующим образом:

nbs.mat[1:10, 1:10]

##       94601 94501 94560 94587 94580 94514 94703 95601 95669 95901
## 94601     0     1     0     0     0     0     0     0     0     0
## 94501     1     0     0     0     0     0     0     0     0     0
## 94560     0     0     0     0     0     0     0     0     0     0
## 94587     0     0     0     0     0     0     0     0     0     0
## 94580     0     0     0     0     0     0     0     0     0     0
## 94514     0     0     0     0     0     0     0     0     0     0
## 94703     0     0     0     0     0     0     0     0     0     0
## 95601     0     0     0     0     0     0     0     0     0     0
## 95669     0     0     0     0     0     0     0     0     0     0
## 95901     0     0     0     0     0     0     0     0     0     0

Необязательно, если вам нужна матрица с двумя столбцами, дающая соседние пары почтовых индексов (т.е. почтовый индекс в столбце 1 и соседний почтовый индекс в столбце 2), вы можете использовать следующее.

nbs.list <- sapply(row.names(nbs.mat), function(x) names(which(nbs.mat[x, ] == 1)))

nbs.pairs <- data.frame(zipcode=rep(names(nbs.list), sapply(nbs.list, length)), 
                        neighbour=unlist(nbs.list))

head(nbs.pairs)

##        zipcode neighbour
## 946011   94601     94501
## 946012   94601     94602
## 946013   94601     94605
## 946014   94601     94606
## 946015   94601     94621
## 946016   94601     94619