2011-04-20 31 views
1

我嘗試使用merge和2位ISO代碼作爲ID向shapefile添加經濟數據。該代碼看起來有點像這樣:合併數據向量到shapefile數據槽

library(maptools) 
library(foreign) 
library(sp) 
library(lattice) 
library(shapefiles) 

world.shp<-readShapePoly("world_shapefile.shp") 

[email protected]<-merge([email protected], data.frame(country=iso.code.vector, net=country.data.vector), by.x="ISO2", by.y="country", all.x=TRUE, sort=FALSE) 

很不幸,這破壞了.shp文件的順序,即使我把sort說法。之後的情節表明,數據與它應該像的多邊形不匹配。我究竟做錯了什麼?

我從thematicmapping.org

由於得到了世界地圖數據的幫助

回答

1

我使用2.12.x和2.13.x,但問題似乎已在2.15版本中已解決的R版本中,當發現了同樣的問題0.1。

+0

後來我發現合併將永遠毀了訂單。解決的辦法是在數據中添加一個新列(稱之爲'索引'),從1到n人爲編號,做你需要處理的原始數據(合併等),並作爲最後一步對它進行排序根據你的'索引'欄回來。 – 2013-09-25 17:22:35

2

合併將始終打破sp對象。以下是將數據幀合併到sp @ dataata datframe的兩種方法。

[email protected] = data.frame([email protected], OtherData[match([email protected]$IDS, OtherData$IDS),]) 

其中;形狀是你的形狀文件,IDS是你想要合併的標識符,而OtherData是你想要與形狀結合的數據框。請注意,IDS可以是兩個數據集中的不同名稱,但實際上需要相同的值(而不是模糊)。

或者,您可以使用此功能。

join.sp.df <- function(x, y, xcol, ycol) { 
    x$sort_id <- 1:nrow(as(x, "data.frame")) 
    x.dat <- as(x, "data.frame") 
    x.dat2 <- merge(x.dat, y, by.x = xcol, by.y = ycol) 
    x.dat2.ord <- x.dat2[order(x.dat2$sort_id), ] 
    x2 <- x[x$sort_id %in% x.dat2$sort_id, ] 
    x2.dat <- as(x2, "data.frame") 
    row.names(x.dat2.ord) <- row.names(x2.dat) 
    [email protected] <- x.dat2.ord 
    return(x2) 
} 

其中; x = sp SpatialDataFrame對象,y =要與x合併的dataframe對象,xcol =合併sp對象中的列名(需要引用),ycol =合併dataframe對象中的列名(需要引用)