標籤:

gal2mat:將gal權重文件轉成n-by-n矩陣

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

掃碼或長按,關注該微信號

weixin.qq.com/r/rzo0LNb (二維碼自動識別)

版權申明

本號所有圖文資料,除特別說明外,其版權歸題主所有。轉發、引用請註明原始出處。


推薦閱讀:

矩陣論筆記(2)
語料庫語言學基礎知識:矩陣(Haskell版)

TAG:矩陣 |