Menggabungkan poin ke kisi menggunakan R


14

Saya punya pertanyaan berkaitan dengan agregasi spasial dalam R. Apa yang saya coba lakukan adalah menggabungkan dataset titik ke kisi. Namun saya tidak yakin bagaimana melakukan ini karena saya memiliki sedikit pengalaman dengan hal-hal semacam ini. Saya berharap ada di antara Anda yang mungkin memiliki panduan yang bermanfaat / solusi yang mungkin.

Poin menguntungkan saya adalah set data yang berisi data georeferensi pada peristiwa konflik di Afrika (lihat www.acleddata.com). Titik-titik tersebut di-georeferensi dengan koordinat garis lintang / garis bujur dan berisi data tentang jenis dan waktu acara. Yang ingin saya lakukan adalah menggabungkan titik-titik ini ke grid 1x1 derajat.

Dengan demikian sel-grid harus berisi informasi dari titik-titik data jika suatu peristiwa terjadi dalam sel-grid itu. Produk akhirnya harus berupa kerangka data atau sesuatu yang dapat saya ekspor ke file csv karena data tersebut dimaksudkan untuk digunakan dalam set data panel untuk analisis statistik.

Sejauh ini saya memuat dan memplot data dan shapefile menggunakan kode di bawah ini. Saya percaya bahwa saya harus menggunakan fungsi over dari paket sp untuk menggabungkan tetapi saya tidak tahu caranya. Semoga salah satu dari Anda dapat membantu.

Kode yang saya gunakan sejauh ini dapat ditemukan di sini dengan hasil visual yang sesuai di sana .

Saran untuk melakukan ini di QGIS juga diterima.


Ini adalah operasi sederhana dan cepat yang hanya membutuhkan sedikit aritmatika. Tapi dalam format apa Anda ingin output? "CSV" hanya menunjukkan bahwa itu harus menjadi tabel relasional, tapi hadiah ini masalah: ketika Anda agregat, setiap sel berpotensi akan sesuai dengan yang bervariasi jumlah poin. Biasanya Anda memilih satu dari dua opsi: Anda bisa mengeluarkan satu rekaman per titik (termasuk ID dari sel yang mengandungnya) atau Anda menampilkan satu rekaman per sel dan menyertakan beberapa ringkasan statistik dari titik-titik yang dikandungnya. Mana yang kamu butuhkan
whuber

1
Maaf saya tidak menyebutkannya. Yang saya butuhkan adalah satu rekaman per sel . Saya menggunakan file csv untuk membuat data panel dalam format sel-tahun .
horseoftheyear

Jawaban:


12

Data yang diunduh berisi beberapa kesalahan lokasi yang jujur, jadi hal pertama yang harus dilakukan adalah membatasi koordinat ke nilai wajar:

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

Komputasi dan pengidentifikasi sel grid hanya masalah memotong desimal dari nilai garis lintang dan garis bujur. (Lebih umum, untuk raster sewenang-wenang, pusat pertama dan skala mereka untuk unit cellsize, memotong desimal, dan kemudian skala ulang dan masukkan kembali ke posisi semula, seperti yang ditunjukkan dalam kode di jibawah ini.) Kita dapat menggabungkan koordinat ini menjadi pengidentifikasi unik, melampirkannya ke kerangka data input, dan menulis kerangka data yang ditambah sebagai file CSV. Akan ada satu catatan per poin:

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

Anda mungkin ingin keluaran yang merangkum peristiwa dalam setiap sel kisi. Untuk mengilustrasikan ini, mari kita hitung jumlah per sel dan mengeluarkannya, satu catatan per sel:

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

Untuk ringkasan lainnya, ubah functionargumen dalam perhitungan counts. (Atau, gunakan spreadsheet atau perangkat lunak database untuk meringkas file output pertama dengan pengidentifikasi sel.)

Sebagai tanda centang, mari memetakan penghitungan menggunakan pusat kotak untuk menemukan simbol peta. (Titik-titik yang terletak di Laut Mediterania, Eropa, dan Samudra Atlantik memiliki lokasi yang dicurigai: Saya menduga banyak di antaranya merupakan hasil dari pencampuran lintang dan bujur dalam proses entri data.)

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

Peta Afrika

Alur kerja ini sekarang

  • Didokumentasikan dengan seksama (melalui Rkode itu sendiri),

  • Reproducible (dengan menjalankan kembali kode ini),

  • Extensible (dengan memodifikasi kode dengan cara yang jelas), dan

  • Cukup cepat (seluruh operasi membutuhkan waktu kurang dari 10 detik untuk memproses 53052 pengamatan ini).


Kode dapat direproduksi dengan sempurna. Saya punya satu pertanyaan tambahan. Alih-alih ringkasan, bagaimana cara melampirkan informasi dari file data input ke sel di kisi yang dibuat?
horseoftheyear

1
Itu tidak mungkin dilakukan dengan tabel output , karena informasi lengkap untuk sel memiliki panjang variabel. Cara yang tepat untuk merekam yaitu dengan bentuk output pertama yang saya perlihatkan: satu catatan per titik dengan atribut pengidentifikasi sel. Salah satu dari dua format ini - tabel per-titik dan per-sel - akan diharapkan oleh program statistik apa pun yang Anda gunakan.
whuber

1
Ah baiklah. Saya mengerti apa yang kamu maksud. Hanya perlu membuat kisi untuk semua sel dan menggabungkannya. Terima kasih untuk bantuannya.
horseoftheyear

3

Nah, yang Anda inginkan adalah dasar yang disebut "Gabung Spasial", yang mencocokkan dua shapefile satu sama lain dan mengalokasikan jumlah (jumlah hitungan) ke tabel atribut yang dihasilkan. Jika Anda mencari "Gabung Spasial di R" Anda akan menemukan banyak contoh bahkan di sini di GIS.Stackexchange. Saya dengan cepat googled dan menemukan misalnya kode ini diposting di milis.

Jika Anda ingin mencapai atribut spasial bergabung di QGIS, maka lakukan hal berikut:

  • Simpan bentuk Anda sebagai file .shp (perintah writeOGR dari paket rgdal)
  • Muat di QGIS. Buat kembali kisi-kisi vektor Anda melalui plugin MMQGIS (Buat -> Buat Kisi Lapisan) dengan skala yang sesuai.
  • Gunakan alat "Gabung Atribut" dari menu Vector -> Manajemen Data. Pilih atribut layer titik Anda (ini bisa berupa kolom sederhana yang mewakili nilai TRUE (1) atau FALSE (0) untuk berbagai peristiwa konflik).
  • Pilih kisi Anda dan jumlah semua kejadian dan jalankan. Setelah itu saya juga akan memotong kotak Anda dengan bentuk benua Afrika.

Jika Bergabung entah bagaimana gagal (tidak berfungsi untuk saya setiap saat), maka tetaplah ke SEXTANTE dan cari kotak alat SAGA, yang juga memiliki fungsi bergabung yang sangat baik.


Meskipun ini adalah solusi, ini adalah solusi yang sangat kompleks dan tidak efisien mengingat bahwa meringkas poin ke grid hanyalah masalah beberapa operasi aritmatika sederhana, yang Runggul di. Menggunakan shapefile,, rgdalQGIS, dan Sextante agak seperti merekomendasikan agar seseorang menyewa pabrik industri otomatis modern untuk menggabungkan dua papan :-).
Whuber

Saya akan mencoba pendekatan ini akhir pekan ini. Dalam waktu dekat saya mungkin ingin menggabungkan berbagai file bentuk satu sama lain sehingga ini bisa bermanfaat. Terima kasih atas masukan dan sarannya.
horseoftheyear

@whuber: Itu benar, tetapi jika Anda ingin mendistribusikan dan mungkin memberi style pada output Anda, maka shapefile adalah pilihan yang jelas. Namun demikian, contoh R yang bagus!
Curlew

Saya akhirnya mencobanya. Tetapi masalah dengan pendekatan ini adalah bahwa semua penjumlahan pengamatan ke poligon. Sementara saya idealnya ingin menyimpan informasi tentang berbagai peristiwa dari waktu ke waktu. Tapi bisa jadi saya melakukan kesalahan.
horseoftheyear
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.