Как прикрепить простой data.frame к SpatialPolygonDataFrame в R? - PullRequest
35 голосов
/ 06 сентября 2010

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

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

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

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

Спасибо!Jens

Ответы [ 5 ]

42 голосов
/ 06 сентября 2010

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

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])

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

18 голосов
/ 13 ноября 2014

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

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

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

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

6 голосов
/ 06 сентября 2010

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

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

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

, если неверное количество строк:

srdf@data=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
2 голосов
/ 06 сентября 2010

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

0 голосов
/ 02 февраля 2018

Еще одним решением является использование функции append_data из пакета tmaptools.Он вызывается с такими аргументами:

append_data(shp, data, key.shp = NULL, key.data = NULL,
  ignore.duplicates = FALSE, ignore.na = FALSE,
  fixed.order = is.null(key.data) && is.null(key.shp))

Немного прискорбно, что он называется добавлением, так как я бы понял, добавление больше в смысле rbind, и мы хотим иметь что-то вроде join или merge Вот.

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

Недостаточное покрытие (элементы формы, которые не соответствуют записям данных), избыточное покрытие (записи данных, которые не соответствуют элементам формы соответственно), а также наличие дублированных значений ключаавтоматически проверяются и сообщаются через консольные сообщения.С помощью under_coverage и over_coverage могут быть получены значения ключа покрытия нижней и нижней границ из последнего вызова append_data,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...