Інформативна частина помилки полягає в тому, що дані, над якими ви працюєте, є об'єктом класу S4 і як такі містять слоти. Це означає, що вам потрібно оперувати відповідним слотом "@data", що містить ваш фрейм даних.
Якщо ви хочете видалити "всі" рядки зі значеннями NA, ви можете просто використовувати na.omit на слоті даних. Це поширюється через об'єкт 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, y = об'єкт dataframe для об'єднання з x, xcol = Об'єднання імені стовпця в об'єкт sp (потрібно цитувати), ycol = Об'єднати ім'я стовпця в об'єкт фрейму даних (потрібно цитувати).
Я чомусь не можу коментувати питання @Kelly, тому я редагую свою оригінальну відповідь. Перевірте, яку версію R та sp використовуєте? Ви можете запустити SessionInfo (), щоб дізнатися це. Поведінка видалення пов'язаних об'єктів з інших слотів даних під час маніпулювання об'єктом @data була доступна лише в останніх кількох версіях sp. Якщо не запущена поточна версія, спробуйте оновити пакет за допомогою "Оновити пакети" в меню пакунків. Якщо працює> = Windows Vista, не забудьте запуститись як адміністратор. Також подивіться на ваші розміри до і після об'єкта, тобто dim (форма), що представляє кількість рядків / число. Кількість рядків відповідає кількості об’єктів функції. Ви можете перевірити результати, перевіривши, чи відповідає кількість рядків у просторовому об'єкті кількості рядків у слоті @data, тобто dim (форма);