объединить вектор данных в слот данных шейп-файла - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь добавить экономические данные в шейп-файл, используя merge и двухзначный код ISO в качестве идентификатора.Код выглядит примерно так:

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)

К сожалению, это разрушает порядок файла .shp, даже если я поставил аргумент sort.После этого график показывает, что данные не соответствуют полигонам, как это должно быть.Что я делаю не так?

Я получил данные карты мира от thematicmapping.org

Спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 02 марта 2013

Слияние всегда будет ломать объект 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 object, y = объект dataframe для слияния с x, xcol = объединить имя столбца в объекте sp (нужно заключить в кавычки), ycol = объединить имя столбца в объекте dataframe (нужно заключить в кавычки)

1 голос
/ 15 сентября 2012

Я обнаружил ту же проблему при использовании версий R 2.12.x и 2.13.x, но проблема, похоже, была решена в версии 2.15.1.

0 голосов
/ 21 апреля 2011

Я нашел обходной путь.На самом деле не очень элегантно, и выполнение занимает некоторое время, но работает:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...