将数据向量合并到shapefile数据槽

时间:2011-04-20 14:33:34

标签: r gis

我尝试使用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文件的顺序。之后的图表显示数据与多边形不匹配。我做错了什么?

我从thematicmapping.org

获取了世界地图数据

感谢您的帮助

3 个答案:

答案 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)