[英]spatialpolygonsdataframe polygons jumbled after merge to join data
我正在嘗試使用R繪制一些土耳其語數據。
我遇到的問題是,當我將我的數據與形狀文件(采用spacepolygonsdataframe格式)合並時,數據不再與正確的pologon相匹配。 我究竟做錯了什么,
下面是一些可復制的代碼。 形狀文件是一些自然地球數據 (因此屬於公共領域),我已將其放在壓縮有簡單數據excel文件的Google驅動器上。 在合並之前和之后,將生成2個地塊,並標有省名。 您會看到第二張圖像已經“弄亂了”數據,並且Turkey.map@data不再與正確的多邊形匹配。
library(maptools)
library(readxl)
temp <- "TurkeyShapefile.zip"
URL <- "https://docs.google.com/ucid=0B0TyKM0aACIONUxfNTJwWGhrR0k&export=download"
download.file(URL,temp, mode="wb")
unzip(temp)
trtr <- readShapeSpatial("Natural_earth_admin_RMS150518_TR")
#read excel file
fname <- "TR_data.xlsx"
TRdata <- read_excel(fname, sheet = "pcnt")
Turkey.map <- trtr #create copy of trtr
#a plot of the map before the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))
#merge (join data)
Turkey.map@data <- merge(Turkey.map@data,TRdata,by.x="Admin1Name",by.y="Province", all.x=TRUE)
#a plot of the map after the merge
plot(Turkey.map)
invisible(text(getSpPPolygonsLabptSlots(Turkey.map), labels=as.character(Turkey.map@data$Admin1Name), cex=0.5))
非常感謝!
如果對空間對象上的@data
插槽執行任何操作可能會重新排序,那么您將痛苦@data
。 通常,您應該通過手動調用匹配數據集之間的ID字段上的which()
來完成所有操作,或者在您的情況下,也可以在SpatialPolygonsDataFrame
對象本身上調用merge()
:
Turkey.map <- merge(
Turkey.map, TRdata,
by.x="Admin1Name", by.y="Province",
all.x=TRUE
)
好奇為什么OP在合並Spatial*
對象和data.frame
時沒有看到正確的輸出,這是一個完全可重現的示例,顯示了正確的行為:
library(sp)
## Reproducible 10x10 grid of polygons:
set.seed(2002)
grd <- GridTopology(c(1,1), c(1,1), c(10,10))
polys <- as(grd, "SpatialPolygons")
centroids <- coordinates(polys)
x <- centroids[,1]
y <- centroids[,2]
z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x
d <- SpatialPolygonsDataFrame(
polys,
data=data.frame(
x=x, y=y, z=z, ID=1:length(x),
row.names=row.names(polys)
)
)
df <- data.frame("ID"=1:10, color="black")
class(d)
class(df)
產量:
class(d)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
class(df)
[1] "data.frame"
然后合並兩個:
## The merge of a SpatialPolygonsDataFrame and a data.frame:
dm <- merge(d, df, by.x="ID", by.y="ID", all.x=T)
## Verify we still have a Spatial* object:
class(dm)
names(dm)
產量:
class(dm)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
names(dm)
[1] "ID" "x" "y" "z" "color"
plot(dm, col=dm$color)
> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices
[4] utils datasets methods
[7] base
other attached packages:
[1] sp_1.1-1
loaded via a namespace (and not attached):
[1] tools_3.2.1 grid_3.2.1
[3] lattice_0.20-31
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.