Видалення рядків у форміфайлу в 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 на слоті даних. Це поширюється через об'єкт 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 (форма);


Спасибі за вашу допомогу! Я повторно повторив просторове з'єднання, тому що я використав "об'єднання" замість "збігу". Я видалив усі рядки NA, але форма все ще присутня у файлі форм, коли я будувати її. Будь-які думки, чому це відбувається?
Келлі

Поправка на цю відповідь необхідна в sp 1.0-15. Тепер викликується специфічна версія функції злиття, коли передається об'єкт sp класу, який виконує правильно, враховуючи, що ви виконуєте відповідність один на один, щоб підтримувати розміри рядків у відповідності з пов'язаними слотами.
Джефрі Еванс

7

З оновленнями в пакетах я запропонував би наступне:

shape <- shape[!is.na(shape@data$col),]

У попередніх версіях це призвело б до примусової форми "форми" у кадр даних. Приємно, що розробники sp починають змушувати деякі стандартні методи R працювати над об'єктами sp. Дякуємо, що надали це оновлення.
Джеффрі Еванс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.