在R中绘制shapefile中的元素

时间:2013-08-19 04:29:23

标签: r plot na shapefile

stackoverflow社区,

我有两个日本自治市的形状文件。我正在使用R为每个城市创建单独的地块。我可以使用一个shapefile来完成这项工作,但是相同的语法会失败。以下是数据的代码和网址:

library(sp)
library(maptools)

# Map A - this one works
# Please download: http://www.filefactory.com/file/z26nirxoz53/n/JPN_adm_zip

# Enter your path for readShapePoly
japanMapA = readShapePoly("JPN_adm/JPN_adm2")
names(japanMapA) 

plot(japanMapA[japanMapA$ID_2 == 1199,])

# Map B - this one doesn't work
# Please download: http://geocommons.com/overlays/173340.zip

# Again, enter your path for readShapePoly    
japanMapB = readShapePoly("japan_ver71") 
names(japanMapB)

plot(japanMapB[japanMapB$JCODE == 45382,])

它抛出的错误是:

Error in plot(japanMapB[japanMapB$JCODE == 45382, ]) : 
error in evaluating the argument 'x' in selecting a method for function 'plot': Error in japanMapB[japanMapB$JCODE == 45382, ] : 
NAs not permitted in row index

我不知道在这种情况下如何去除NA,所以我无法绘制单个元素。

非常感谢你的帮助:我一直在墙上撞了一会儿!

2 个答案:

答案 0 :(得分:6)

我认为这归结为适当的子设置问题。

您的japanMapB对象包含一些元数据以及japanMapB@polygons中存储的每个形状的一系列多边形。所以,你有:

> length(japanMapB$JCODE)
#[1] 1902
> length(japanMapB@polygons)
#[1] 1902

正如@PaulHiemstra指出的那样,您的NA变量中有一些JCODE个值

> table(is.na(japanMapB$JCODE))

#FALSE  TRUE 
# 1894     8 

这意味着您在尝试索引要绘制的城市时获得NA结果。

> table(japanMapB$JCODE==45382,useNA="always")

#FALSE  TRUE  <NA> 
# 1893     1     8 

结束which解决了这个问题:

which(japanMapB$JCODE == 45382)
#[1] 1802
#You will now select to plot only the 1802th polygon stored in the data object
plot(japanMapB[which(japanMapB$JCODE == 45382),])

答案 1 :(得分:3)

可能会发生的是有NA id的市政/多边形。例如:

id = c(1,2,3,NA)
id == 2
# [1] FALSE  TRUE FALSE    NA

请注意,通过此比较,NA中的id值不会导致FALSE,而是导致NA。使用id == 2进行子集化可以解决您看到的问题。 @thelatemail将调用包装在which中,将逻辑向量转换为一组索引,其中逻辑向量为TRUE

which(id == 2)
# [1] 3

请注意,对which的调用会消除NA。这个索引向量可以安全地用于子集。通常,您可以使用na.omit删除NA

l[l == 2]
# [1]  2 NA
l[na.omit(l == 2)]
# [1] 2