gal2mat:將gal權重文件轉成n-by-n矩陣
來自專欄 R語言區域經濟研究
一、gal格式文件
GeoDa 生成的gal權重文件為文本格式,可用「記事本」打開。如下圖所示的描述中國31個大陸省份鄰近情況的文件內容,其第一行為文件頭說明,表示有31個單元,基於shape文件Province31生成,識別單元的變數為POLY_ID。第2行表示POLY_ID編號為1的單元有2個鄰居,它們的編號在第3行給出,分別為15和19;第4行和第5行給出編號為2的鄰居信息,余者類推。需要說明的是,海南(編號為20)沒有鄰居,因此其鄰居數為0,下面一行為空。
二、R語言程序gal2mat
利用R語言包spdep包中的nb2mat,可以將gal文件轉成n*n矩陣。nb2mat默認為行標準化。如果有單元無鄰居,需要將zero.policy設為TRUE。
現自編R語言程序gal2mat()將gal文件轉成n*n矩陣,其參數設定如下:
gal2mat(gal, row.st = TRUE)
其中,gal為文件路徑,row.st設定要不要行標準化,默認為TRUE。
註:你會發現,如果有單元無鄰居,這會帶來一些問題。如何解決?且聽下回分解。
代碼
#設置為自己的工作文件夾
> setwd("…\gal2mat")
# 用nb2mat將gal文件轉成矩陣
> library(spdep)
> mynb <- read.gal("province31.gal")
> spmat1 <- nb2mat(mynb, zero.policy=TRUE)
#用自編函數將gal文件轉成矩陣
#載入函數gal2mat
> source("gal2mat.R")
> spmat2 <- gal2mat("province31.gal")
Read 198 items
Warning messages:
1: In gal2mat("province31.gal") : Unit 20 has no neighbor.
2: In FUN(newX[, i], ...) : The sum of row is 0.
#比較spmat1和spmat2是否一致,結果顯示為一致
> all(spmat1 == spmat2)
[1] TRUE
#寫出n*n空間權重矩陣
> write.csv(spmat2, "spmat.csv")
數據和代碼下載請關注微信公眾號:「思達區域經濟研究方法」,SDAR-workshop
掃碼或長按,關注該微信號
http://weixin.qq.com/r/rzo0LNbELItTrZJP92_9 (二維碼自動識別)
版權申明
本號所有圖文資料,除特別說明外,其版權歸題主所有。轉發、引用請註明原始出處。
推薦閱讀:
※矩陣論筆記(2)
※語料庫語言學基礎知識:矩陣(Haskell版)
TAG:矩陣 |