我尝试使用merge
和2位ISO代码作为ID将经济数据添加到shapefile。代码看起来有点像这样:
library(maptools)
library(foreign)
library(sp)
library(lattice)
library(shapefiles)
world.shp<-readShapePoly("world_shapefile.shp")
world.shp@data<-merge(world.shp@data, data.frame(country=iso.code.vector, net=country.data.vector), by.x="ISO2", by.y="country", all.x=TRUE, sort=FALSE)
不幸的是,即使我放了sort
参数,也会破坏.shp文件的顺序。之后的图表显示数据与多边形不匹配。我做错了什么?
感谢您的帮助
答案 0 :(得分:2)
合并将始终破坏sp对象。以下是将数据框合并到sp @data数据框的两种方法。
shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])
其中; shape是您的形状文件,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)
x2@data <- x.dat2.ord
return(x2)
}
其中; x = sp SpatialDataFrame对象,y =要与x合并的数据帧对象,xcol = sp对象中的合并列名称(需要引用),ycol =数据框对象中的合并列名称(需要引用)
答案 1 :(得分:1)
使用R版本2.12.x和2.13.x时发现了同样的问题,但问题似乎已在2.15.1版本中得到解决。
答案 2 :(得分:0)
我找到了解决方法。实际上不是很优雅,执行需要一些时间,但它可以工作:
world.shp<-readShapePoly("world_shapefile.shp")
net<-rep(NA,length(world.shp@data$NAME))
for(i in 1:length(net))
{
for(j in 1:length(iso.code.vector))
{
if(!is.na(world.shp@data$ISO2[i])){if(world.shp@data$ISO2[i]==iso.code.vector[j]){net[i]=country.data.vector[j]}}
}
}
world.shp@data<-data.frame(world.shp@data, net)