2013-08-19 25 views
4

stackoverflow社區,從形狀文件中繪製元素R

我有兩個日本自治市的形狀文件。我正在使用R爲每個城市創建單獨的地塊。我可以使用一個shapefile來完成這項工作,但是相同的語法會失敗。下面是代碼和數據的URL:

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 

我不知道如何去在這種情況下取​​出來港,所以我無法繪製個別元素。

非常感謝您的幫助:一直在我的頭上撞牆!

+0

'圖(japanMapB)'的作品,所以我的猜測是什麼有趣的是你的選擇。什麼是JCODE?你爲什麼選擇這個變量來繪圖? – thelatemail

+0

類似於:'plot(japanMapB [which(japanMapB $ JCODE == 45382),])''似乎可以用來繪製一段。 – thelatemail

回答

5

我認爲這歸結爲與相應的子設置的問題。

您的japanMapB對象包含一些元數據和一系列存儲在[email protected]中的每個形狀的多邊形。所以,你必須:

> length(japanMapB$JCODE) 
#[1] 1902 
> length([email protected]) 
#[1] 1902 

由於@PaulHiemstra指出,雖然,你有你的JCODE可變

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

#FALSE TRUE 
# 1894  8 

一些NA值這意味着你想索引你要繪製的直轄市時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),]) 
+0

使用'which'完美地工作。非常感謝您的詳細回覆,@thelatemail以及您的觀點@PaulHiemstra:我現在對它的工作原理有了更好的理解! – spatiallyConfused

3

可能發生的情況是有市政/多邊形NA ID。例如:

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

注意,與此相比,在idNA值不會導致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 
+1

是的 - 這當然是問題 - 當我打字時,你擊敗了我,但我在另一個答案中解釋了OP的具體情況。 – thelatemail

+0

@thelatemail指出,是的,這絕對是問題。非常感謝分離和解決問題! – spatiallyConfused