R语言 在spdep包中使用poly2nb()和nb2mat()时遇到困难

jum4pzuy  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(258)

我希望得到一些关于使用spdep()包创建空间权重矩阵的建议。
(1)如果我有从rnaturalearth包下载的空间数据,并且在另一个数据集中有一个国家列表,那么什么是对数据进行子集化的有效方法?

library(rnaturalearth)
ne_sf <- ne_countries(returnclass = "sf")

我有一个国家列表,dput(in_data_set)返回:

c("ALB", "ARE", "ARG", "ARM", "AUS", "AUT", "AZE", "BEL", "BGD", 
"BGR", "BIH", "BLR", "BLZ", "BOL", "BRA", "BWA", "CAF", "CAN", 
"CHE", "CHL", "CHN", "CMR", "COD", "COG", "COL", "CRI", "CYP", 
"DEU", "DJI", "DNK", "DZA", "ECU", "ERI", "ESP", "EST", "ETH", 
"FIN", "FJI", "FRA", "GAB", "GBR", "GEO", "GNB", "GNQ", "GRC", 
"GUY", "HRV", "HUN", "IDN", "IND", "IRL", "ISL", "ISR", "ITA", 
"JAM", "JOR", "JPN", "KAZ", "KEN", "KHM", "KWT", "LBN", "LBR", 
"LBY", "LKA", "LSO", "LTU", "LUX", "LVA", "MAR", "MDG", "MEX", 
"MLI", "MNE", "MNG", "MOZ", "MWI", "MYS", "NAM", "NIC", "NLD", 
"NOR", "NPL", "NZL", "OMN", "PAK", "PAN", "PER", "PHL", "POL", 
"PRT", "QAT", "ROU", "SAU", "SEN", "SLE", "SLV", "SRB", "SVN", 
"SWE", "TCD", "THA", "TJK", "TTO", "TUN", "UKR", "URY", "USA", 
"VNM", "ZAF", "ZMB")

因此,问题是如何使用这个由三个字母组成的国家/地区代码向量来对数据进行子集化。ne_sf中的一个对象是iso_a3,国家/地区代码可以与之匹配。
1.当我跳过并尝试创建一个(未子集化的)空间矩阵时,我得到如下错误(我假设在我对数据进行子集化时该错误不会消失):
w_ne_sf〈-聚合物2nb(ne_sf)%〉% nb 2 mat(样式=“W”)
wk_handle.wk_wkb(wkb,s2_geography_writer(oriented =定向,:循环7无效:边缘172与边缘174交叉

4uqofj5v

4uqofj5v1#

第一个问题的答案很简单:

library(rnaturalearth)
library(sf)
library(dplyr)
ne_sf <- ne_countries(returnclass = "sf")

incl <- c("ALB", "ARE", "ARG", "ARM", "AUS", "AUT", "AZE", "BEL", "BGD", 
          "BGR", "BIH", "BLR", "BLZ", "BOL", "BRA", "BWA", "CAF", "CAN", 
          "CHE", "CHL", "CHN", "CMR", "COD", "COG", "COL", "CRI", "CYP", 
          "DEU", "DJI", "DNK", "DZA", "ECU", "ERI", "ESP", "EST", "ETH", 
          "FIN", "FJI", "FRA", "GAB", "GBR", "GEO", "GNB", "GNQ", "GRC", 
          "GUY", "HRV", "HUN", "IDN", "IND", "IRL", "ISL", "ISR", "ITA", 
          "JAM", "JOR", "JPN", "KAZ", "KEN", "KHM", "KWT", "LBN", "LBR", 
          "LBY", "LKA", "LSO", "LTU", "LUX", "LVA", "MAR", "MDG", "MEX", 
          "MLI", "MNE", "MNG", "MOZ", "MWI", "MYS", "NAM", "NIC", "NLD", 
          "NOR", "NPL", "NZL", "OMN", "PAK", "PAN", "PER", "PHL", "POL", 
          "PRT", "QAT", "ROU", "SAU", "SEN", "SLE", "SLV", "SRB", "SVN", 
          "SWE", "TCD", "THA", "TJK", "TTO", "TUN", "UKR", "URY", "USA", 
          "VNM", "ZAF", "ZMB")

ne_sub <- ne_sf %>% 
  filter(iso_a3 %in% incl)
nrow(ne_sf)
#> [1] 177
nrow(ne_sub)
#> [1] 111

reprex package(v2.0.1)于2023年1月19日创建
第二个问题的答案更具挑战性。This GitHub问题表明,球面几何可能在这里工作得不好,如果有意义,您可以重新构建它。

x6h2sr28

x6h2sr282#

对于问题的第二部分,我接受了戴夫·阿姆斯特朗的暗示,得以越过这条线,并将努力分为以下几个方面:

ne_sub1 <- st_make_valid(ne_sub)
w_ne_sub  <- poly2nb(ne_sub1) %>% nb2mat(style = "W", zero.policy=TRUE)

谢谢大家

相关问题