Как подключить простой 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
Ответы
Ответ 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 может дать вдохновение. (Но я могу ошибаться, поскольку я был в последний раз.)