Подтвердить что ты не робот

Как подключить простой data.frame к пространству SpatialPolygonDataFrame в R?

У меня (опять же) проблема с объединением кадров данных в R. Но на этот раз это SpatialPolygonDataFrame (SPDF), а другой - обычный data.frame(DF). SPDF имеет около 1000 строк DF только 400. Оба имеют общий столбец, QDGC

Теперь я попробовал

oo <- merge(SPDF,DF, by="QDGC", all=T)

но это приводит только к нормальному кадру данных, а не к пространственному многоугольному кадру данных. Я читал где-то еще, что это не работает, но я не понимал, что делать в таком случае (нужно что-то делать с столбцами ID, использовать слияние)

oooh такой сложный вопрос, я не знаю...

Спасибо! Jens

4b9b3361

Ответ 1

Пусть df = фрейм данных, sp = объект пространственного полигона и число = или номер столбца общего столбца. Затем вы можете объединить кадр данных в sp-объект, используя следующую строку кода

[email protected] = data.frame([email protected], df[match([email protected][,by], df[,by]),])

Вот как работает код. Функция соответствия внутри выравнивает столбцы, чтобы сохранить порядок. Поэтому, когда мы объединяем его с данными sp @, порядок корректно сохраняется. Быстрая проверка, чтобы проверить, работает ли код, - проверить два столбца, соответствующие общему столбцу, и посмотреть, идентичны ли они (общие столбцы дублируются и их легко удалить, но я сохраняю их, поскольку это хорошая проверка)

Ответ 2

Это так просто:

require(sp) # the trick is that this package must be loaded!

oo <- merge(SPDF,DF, by="QDGC")

Я тестировал сам. Но он работает, только если вы используете слияние из пакета sp. Это значение по умолчанию при загрузке пакета sp. Функция merge затем перегружается и sp::merge используется, если первый аргумент является пространственной структурой.

Ответ 3

merge может создавать блок данных с большим количеством строк, чем оригиналы, если нет простого сопоставления 1-1 двух данных. В этом случае ему пришлось бы скопировать всю геометрию и создать несколько полигонов, что, вероятно, не очень хорошо.

Если у вас есть фреймворк данных с таким же количеством строк, что и SpatialPointsDataFrame, вы можете просто просто заменить слот @data.

library(sp)
example(overlay) # to get the srdf object
[email protected]
spplot(srdf)
[email protected]=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)

если вы ошиблись в количестве строк:

[email protected]=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 2

Ответ 4

Возможно, функция joinCountryData2Map в пакете rworldmap может дать вдохновение. (Но я могу ошибаться, поскольку я был в последний раз.)