Удаление строк в шейп-файле в R

12

Я импортировал шейп-файл в R и соединил его с таблицей. Мой шейп-файл содержит все идентификаторы переписи, а моя таблица содержит только выбранные идентификаторы переписи. Я сейчас пытаюсь удалить все строки не получили совпадения.

Вот как выглядит мой набор данных (я пытаюсь удалить все строки с помощью NA, поэтому нужно удалить последние два):

  CTUID   Cluster   Average
5350007.01  1       124.53
5350007.02  1       234.87
5350010.01  4       110.11
5350010.02  5       187.68
5350001     NA        NA
5350002     NA        NA

Я пытался использовать этот код строки:

shape2[!(rowSums(is.na(shape2))==NCOL(shape2)),]

Который дал мне эту ошибку:

Error in rowSums(is.na(shape2)) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.na(shape2) : is.na() applied to non-(list or vector) of type 'S4'

Я не очень опытный в R, поэтому любая помощь будет очень признательна. Если бы вы могли включить краткое объяснение, это было бы фантастическим.

Келли
источник

Ответы:

13

Информативная часть ошибки состоит в том, что данные, с которыми вы работаете, являются объектом класса 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);

Джеффри Эванс
источник
Спасибо за вашу помощь! Я переделал пространственное соединение, потому что я использовал «слияние» вместо «совпадение». Я удалил все строки NA, но форма все еще присутствует в шейп-файле, когда я его строю. Есть мысли о том, почему это происходит?
Келли
Поправка к этому ответу необходима на SP 1.0-15. Специальная версия sp функции слияния теперь вызывается, когда передается объект класса sp, который работает правильно, если вы выполняете однозначное соответствие, чтобы размеры строк соответствовали соответствующим слотам.
Джеффри Эванс
7

С обновлениями в пакетах я бы предложил следующее:

shape <- shape[!is.na(shape@data$col),]
WAF
источник
В прошлых версиях это приводило к тому, что «shape» приводился в data.frame. Приятно, что разработчики sp начинают заставлять некоторые стандартные методы R работать с объектами sp. Спасибо за предоставление этого обновления.
Джеффри Эванс