Menghapus baris di shapefile di R


12

Saya telah mengimpor shapefile ke R, dan bergabung ke sebuah tabel. Shapefile saya berisi semua id sensus, sementara tabel saya hanya berisi id sensus terpilih. Saya sekarang mencoba menghapus semua baris yang tidak cocok.

Ini adalah tampilan dataset saya (Saya mencoba untuk menghapus semua baris dengan NA, jadi dua yang terakhir perlu dihapus):

  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

Saya sudah mencoba menggunakan kode baris ini:

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

Yang memberi saya kesalahan ini:

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'

Saya tidak begitu mahir dalam R, jadi bantuan apa pun akan sangat dihargai. Jika Anda bisa memasukkan penjelasan singkat yang akan fantastis.

Jawaban:


13

Bagian informatif dari kesalahan adalah bahwa data yang Anda operasikan adalah objek kelas S4 dan karenanya berisi slot. Ini berarti bahwa Anda perlu beroperasi pada slot "@ data" yang sesuai yang berisi kerangka data Anda.

Jika Anda ingin menghapus baris "semua" dengan nilai NA, Anda bisa menggunakan na.omit pada slot dataframe. Ini melakukan propgate melalui objek sp dan menghilangkan titik / poligon terkait di slot lain.

shape@data <- na.omit(shape@data)

Jika Anda ingin menghapus baris dengan NA di kolom tertentu, Anda dapat menggunakan:

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

**** Perbarui 03/08/2016 Sekarang ada fungsi gabungan asli yang beroperasi pada objek sp. Anda dapat memanggil penggabungan dengan cara yang sama seperti yang Anda lakukan dengan bingkai data lainnya. Namun argumen x adalah objek kelas sp SpatailDataFrame dan y adalah data.frame apa pun yang ingin Anda gabungkan. Saya meninggalkan jawaban asli untuk tujuan referensi.


Saya juga harus menunjukkan bahwa Anda tidak dapat menggunakan fungsi gabungan untuk bergabung ke objek sp. Fungsi gabungan menggunakan data selama operasi yang memutuskan hubungan internal dalam objek sp. Ini adalah sesuatu yang, sayangnya, tidak diiklankan secara luas. Untuk menggabungkan dataframe ke slot @data objek sp Anda dapat menggunakan kecocokan dengan cara ini.

shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])

Dimana; bentuk adalah file bentuk Anda, IDS adalah pengidentifikasi yang ingin Anda gabungkan dan OtherData adalah kerangka data yang ingin Anda gabungkan dengan bentuk. Perhatikan bahwa IDS dapat berupa nama yang berbeda dalam dua set data tetapi harus benar-benar memiliki nilai yang sama (bukan fuzzy).

Atau Anda dapat menggunakan fungsi ini.

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)
}

Dimana; x = sp Objek SpatialDataFrame, y = objek dataframe untuk digabungkan dengan x, xcol = Gabungkan nama kolom dalam objek sp (perlu mengutip), ycol = Gabungkan nama kolom dalam objek dataframe (perlu mengutip).

Untuk beberapa alasan saya tidak bisa mengomentari @Kelly pertanyaan jadi saya mengedit jawaban asli saya. Periksa versi R dan sp apa yang Anda jalankan? Anda dapat menjalankan SessionInfo () untuk mengetahuinya. Perilaku menghapus objek terkait dalam slot data lain saat memanipulasi objek data hanya tersedia di beberapa versi sp terakhir. Jika tidak menjalankan versi saat ini, coba perbarui paket dengan "Perbarui paket" di bawah menu paket. Jika menjalankan> = Windows Vista pastikan untuk menjalankan sebagai administrator. Juga perhatikan dimensi objek Anda sebelum dan sesudah, yaitu redup (bentuk), yang mewakili jumlah baris / cols. Jumlah baris sesuai dengan jumlah objek fitur. Anda dapat mengecek hasilnya dengan memeriksa untuk melihat apakah jumlah baris dalam objek spasial cocok dengan jumlah baris dalam slot @ data yaitu, redup (bentuk);


Terima kasih atas bantuan Anda! Saya redid gabung spasial karena saya memang menggunakan 'gabung' bukan 'cocok'. Saya telah menghapus semua baris NA, tetapi bentuknya masih ada di shapefile ketika saya memplotnya. Adakah pemikiran mengapa ini terjadi?
Kelly

Amandemen untuk jawaban ini diperlukan di sp 1.0-15. Versi spesifik fungsi penggabungan sp sekarang disebut, ketika melewati objek kelas sp, yang melakukan dengan benar mengingat Anda melakukan kecocokan satu ke satu untuk menjaga dimensi baris konsisten dengan slot terkait.
Jeffrey Evans

7

Dengan pembaruan dalam paket saya menyarankan yang berikut:

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

Dalam versi sebelumnya yang akan menghasilkan "bentuk" dipaksa menjadi data.frame. Sangat menyenangkan bahwa pengembang sp mulai membuat beberapa metode R standar bekerja pada objek sp. Terima kasih telah menyediakan pembaruan ini.
Jeffrey Evans
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.