Информативная часть ошибки состоит в том, что данные, с которыми вы работаете, являются объектом класса S4 и поэтому содержат слоты. Это означает, что вам нужно работать с соответствующим слотом «@data», содержащим ваш фрейм данных.
Если вы хотите удалить «все» строки со значениями NA, вы можете просто использовать na.omit в слоте dataframe. Это распространяется через объект sp и удаляет связанные точки / многоугольники в других слотах.
shape@data <- na.omit(shape@data)
Если вы хотите удалить строки с NA в определенном столбце, вы можете использовать:
shape@data <- shape[!is.na(shape@data$col) ,]
**** Обновление 03/08/2016 Теперь существует встроенная функция слияния, которая работает с объектами sp. Вы можете вызвать слияние таким же образом, как и с любым другим data.frame. Однако аргумент x - это объект класса sp SpatailDataFrame, а y - любой data.frame, который вы хотите объединить. Я оставляю оригинальный ответ для справочных целей.
Я также должен отметить, что вы не можете использовать функцию слияния для присоединения к объекту sp. Функция слияния восстанавливает данные во время операции, которая нарушает внутренние отношения в объекте sp. Это то, что, к сожалению, широко не рекламируется. Чтобы объединить фрейм данных со слотом @data объекта sp, вы можете использовать match таким образом.
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 (нужно заключить в кавычки).
По какой-то причине я не могу комментировать вопрос @Kelly, поэтому я редактирую свой оригинальный ответ. Проверьте, какую версию R и SP вы используете? Вы можете запустить SessionInfo (), чтобы узнать. Поведение удаления связанных объектов в других слотах данных при манипулировании объектом @data было доступно только в последних двух версиях sp. Если текущая версия не запущена, попробуйте обновить пакет с помощью «Обновить пакеты» в меню пакетов. Если запущено> = Windows Vista, обязательно запустите от имени администратора. Также обратите внимание на размеры объекта до и после, т.е. dim (форма), который представляет количество строк / столбцов. Количество строк соответствует количеству объектов объектов. Вы можете проверить результаты, проверив, совпадает ли количество строк в пространственном объекте с количеством строк в слоте @data, т.е. dim (shape);
С обновлениями в пакетах я бы предложил следующее:
источник