Bagaimana cara melampirkan data.frame sederhana ke SpatialPolygonDataFrame di R?

Saya (sekali lagi) memiliki masalah dalam menggabungkan bingkai data di R. Tapi kali ini, yang satu adalah SpatialPolygonDataFrame (SPDF) dan yang lainnya adalah data.frame biasa (DF). SPDF memiliki sekitar 1000 baris, DF hanya 400. Keduanya memiliki kolom yang sama, QDGC

Sekarang, saya mencoba

oo <- merge(SPDF,DF, by="QDGC", all=T)

tapi ini hanya menghasilkan data.frame normal, bukan lagi bingkai data poligon spasial. Saya membaca di tempat lain, bahwa ini tidak berhasil, tetapi saya tidak mengerti apa yang harus dilakukan dalam kasus seperti itu (harus melakukan sesuatu dengan kolom ID, menggabungkan penggunaan)

oooh pertanyaan yang sulit, kurasa...

Terima kasih! Jen


person Jens    schedule 06.09.2010    source sumber


Jawaban (6)


Misal df = bingkai data, sp = objek poligon spasial dan by = nama atau nomor kolom dari kolom umum. Anda kemudian dapat menggabungkan bingkai data ke dalam objek sp menggunakan baris kode berikut

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])

Inilah cara kerja kodenya. Fungsi pencocokan di dalam menyelaraskan kolom sehingga ketertiban tetap terjaga. Jadi saat kami menggabungkannya dengan sp@data, pesanan tetap terjaga dengan benar. Pemeriksaan cepat untuk melihat apakah kode telah berfungsi adalah dengan memeriksa dua kolom yang sesuai dengan kolom umum dan melihat apakah keduanya identik (kolom umum dapat diduplikasi dan mudah untuk menghapus salinannya, tetapi saya menyimpannya apa adanya. cek bagus)

person Ramnath    schedule 06.09.2010
comment
Terima kasih banyak! Anda menyelamatkan malam saya! Dan mungkin juga sepanjang minggu! Itu bekerja dengan sangat baik. - person Jens; 06.09.2010
comment
@Ramnath Apakah solusi ini akan berhasil jika bingkai data spasial memiliki lebih banyak baris (poligon) daripada data yang digabungkan? Dan juga dalam kasus sebaliknya - kapan ada lebih banyak observasi dalam data gabungan? - person radek; 13.04.2013
comment
Apa bedanya jika kedua objek berukuran SpatialP*DataFrames? - person gregmacfarlane; 24.08.2013
comment
Saya rasa Anda dapat mencoba mengganti df dengan df@data[,by] jika df juga merupakan SpatialP*DataFrame - person Ramnath; 24.08.2013

Semudah ini:

require(sp) # the trick is that this package must be loaded!

oo <- merge(SPDF,DF, by="QDGC")

Saya sudah mengujinya sendiri. Namun ini hanya berfungsi jika Anda menggunakan merge from package sp. Ini adalah default ketika paket sp dimuat. Fungsi merge kemudian kelebihan beban dan sp::merge digunakan jika argumen pertama adalah struktur spasial.

person Tomas    schedule 13.11.2014
comment
Ini bekerja dengan sangat baik bagi saya! Namun, menurut saya perlu diperhatikan bahwa beberapa masalah mungkin muncul jika kerangka data dan SPDF tidak memiliki jumlah baris yang sama. Saya terus mendapatkan kesalahan (jumlah objek tidak cocok) yang disebabkan oleh masalah ini. Akhirnya, saya bisa melakukan penggabungan dengan menambahkan all.x = TRUE (di mana x adalah SPDFnya). - person Javier Fajardo; 01.11.2017

penggabungan dapat menghasilkan kerangka data dengan lebih banyak baris daripada aslinya jika tidak ada pemetaan 1-1 yang sederhana dari kedua kerangka data. Dalam hal ini, ia harus menyalin semua geometri dan membuat banyak poligon, yang mungkin bukan hal yang baik.

Jika Anda memiliki kerangka data yang jumlah barisnya sama dengan SpatialPointsDataFrame, Anda bisa langsung mengganti slot @data.

library(sp)
example(overlay) # to get the srdf object
srdf@data
spplot(srdf)
srdf@data=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)

jika Anda salah memasukkan jumlah baris:

srdf@data=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 2
person Spacedman    schedule 06.09.2010
comment
Oke saya melakukan yang berikut: (1) oo ‹- merge(SPDF,DF, by=QDGC, all=T) (2) SPDF@data ‹- oo (3) plot(SPDF) datanya sekarang ada tetapi dalam waktu yang sangat lama pesanan salah. mungkin aku harus menyortir sesuatu? - person Jens; 06.09.2010
comment
Aduh. aku seharusnya memeriksanya. - person Spacedman; 06.09.2010

Mungkin fungsi joinCountryData2Map pada paket rworldmap bisa memberikan inspirasi. (Tetapi saya mungkin salah, seperti yang terakhir kali saya lakukan.)

person Karsten W.    schedule 06.09.2010

Satu solusi lagi adalah dengan menggunakan fungsi append_data dari paket tmaptools . Disebut dengan argumen berikut:

append_data(shp, data, key.shp = NULL, key.data = NULL,
  ignore.duplicates = FALSE, ignore.na = FALSE,
  fixed.order = is.null(key.data) && is.null(key.shp))

Agak disayangkan ini disebut append karena saya lebih memahami append dalam arti rbind dan kami ingin memiliki sesuatu seperti join atau merge di sini.

Mengabaikan fakta itu, fungsinya sangat berguna untuk memastikan gabungan Anda benar dan jika beberapa baris hanya ada di satu sisi gabungan. Dari dokumen:

Di bawah cakupan (item bentuk yang tidak sesuai dengan catatan data), cakupan berlebih (catatan data yang masing-masing tidak sesuai dengan item bentuk) serta keberadaan nilai kunci duplikat secara otomatis diperiksa dan dilaporkan melalui pesan konsol. Dengan under_coverage dan over_coverage nilai kunci cakupan bawah dan atas dari panggilan append_data terakhir dapat diambil,

person radek    schedule 02.02.2018

Jika ada dua shapefile yang perlu digabungkan menjadi satu objek, cukup gunakan rbind().

Saat menggunakan rbind(), pastikan kedua argumen yang Anda gunakan adalah SpatialDataFrames. Anda dapat memeriksanya menggunakan class(sf). Jika ini bukan kerangka data, gunakan st_as_sf() untuk mengonversinya menjadi SpatialDataFrame sebelum Anda mengikatnya kembali.

Catatan : Anda juga dapat menggunakan ini untuk menambahkan ke NULLs, terutama ketika Anda menggunakan hasil dari perulangan dan Anda ingin mengumpulkan hasilnya.

person Jerin Mathew    schedule 05.07.2021