R kullanarak noktaları ızgaraya toplama


14

R'de uzamsal kümelenme ile ilgili bir sorum var. Yapmaya çalıştığım, bir tabloya nokta veri kümesini toplamak. Ancak bu tür şeyler ile çok az deneyimim var bunu nasıl emin değilim. Herhangi birinizin yararlı bir rehber / olası bir çözümü olabileceğini umuyordum.

Bakış açım, Afrika'daki çatışma olayları hakkında coğrafi referanslı veriler içeren bir veri kümesidir (bkz. Www.acleddata.com). Noktalar enlem / boylam koordinatları ile coğrafi olarak referanslandırılır ve olay türü ve zamanı hakkında veriler içerir. Yapmak istediğim bu noktaları 1x1 derecelik bir ızgaraya toplamak.

Bu nedenle, bir ızgara hücresi, o ızgara hücresi içinde bir olay meydana geldiğinde veri noktalarının bilgilerini içermelidir. Bunun nihai ürünü, bir veri çerçevesi veya verilerin istatistiksel analiz için bir panel veri kümesinde kullanılması amaçlandığı için bir csv dosyasına verebileceğim bir şey olmalıdır.

Şimdiye kadar aşağıdaki kodu kullanarak veri ve şekil dosyasını yükledim ve çizdim. Toplama için sp paketinden over işlevini kullanmalıyım ama nasıl yapacağımı bilmiyorum. Umarım biriniz yardımcı olabilir.

Şu ana kadar kullanılan kod bulunabilir burada üzerinde gelen görsel sonuçla orada .

Bunu QGIS'de yapma önerisi de memnuniyetle karşılanmaktadır.


Bu, küçük bir aritmetikten başka bir şey gerektirmeyen hızlı ve basit bir işlemdir. Peki çıktıların hangi formatta olmasını istiyorsunuz? "CSV" yalnızca ilişkisel bir tablo olması gerektiğini belirtir, ancak bu bir sorun oluşturur: topladığınızda, her hücre potansiyel olarak değişen sayıda noktaya karşılık gelir . Genellikle iki seçenekten birini seçersiniz: ya her nokta için bir kayıt (içerdiği hücrenin kimliği dahil) ya da her hücre için bir kayıt çıkarır ve içerdiği noktaların bazı istatistiki özetleri eklersiniz. Hangisine ihtiyacınız var?
whuber

1
Üzgünüm bunu belirtmedim. İhtiyacım olan her hücre için bir kayıt . Hücre yılı formatında panel verileri yapmak için csv dosyasını kullanıyorum .
horseoftheyear18

Yanıtlar:


13

İndirilen veriler bazı açık konum hataları içerir, bu nedenle yapılacak ilk şey koordinatları makul değerlerle sınırlamaktır:

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

Izgara hücre koordinatlarını ve tanımlayıcılarını hesaplamak, yalnızca ondalık sayıları enlem ve boylam değerlerinden kesmektir. (Daha genel olarak, rasgele rasterler için, önce bunları ortadaki hücrelerin boyutuna göre ölçeklendirin, ondalık sayıları kısaltın ve sonra jiaşağıdaki kodda gösterildiği gibi orijinal konumlarına yeniden ölçeklendirin ve yeniden girin .) Bu koordinatları benzersiz tanımlayıcılar halinde birleştirebiliriz, giriş veri çerçevesine ekleyebilir ve artırılmış veri çerçevesini CSV dosyası olarak yazabilirsiniz. Her puan için bir kayıt olacak:

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)

Bunun yerine, her ızgara hücresindeki olayları özetleyen çıktılar isteyebilirsiniz. Bunu göstermek için, hücre başına sayıları hesaplayalım ve hücre başına bir kayıt çıkaralım:

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

Diğer özetler için, functionhesaplamasındaki argümanı değiştirin counts. (Alternatif olarak, ilk çıktı dosyasını hücre tanımlayıcıyla özetlemek için elektronik tablo veya veritabanı yazılımı kullanın.)

Kontrol olarak, harita sembollerini bulmak için ızgara merkezlerini kullanarak sayıları eşleyelim. (Akdeniz, Avrupa ve Atlantik Okyanusu'nda bulunan noktaların şüpheli konumları vardır: Birçoğunun veri giriş sürecinde enlem ve boylamı karıştırmasından kaynaklandığını düşünüyorum.)

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

Afrika Haritası

Bu iş akışı şimdi

  • Kapsamlı bir şekilde belgelenmiş ( Rkodun kendisi aracılığıyla),

  • Tekrarlanabilir (bu kodu yeniden çalıştırarak),

  • Genişletilebilir (kodu bariz şekilde değiştirerek) ve

  • Oldukça hızlı (bu 53052 gözlemi işlemek için tüm işlem 10 saniyeden az sürer).


Kod mükemmel şekilde yeniden üretilebilir. Yine de bir sorum daha var. Özet yerine, giriş veri dosyasındaki bilgileri oluşturulan kılavuzdaki hücreye nasıl eklerim ?
horseoftheyear18

1
Bir çıktı tablosu ile yapmak mümkün değildir , çünkü hücreler için tüm bilgiler değişken uzunluktadır. İlk çıkış biçimi I ile kayıt yapmanın uygun yolu: hücre tanımlayıcı özniteli her nokta için bir kayıt. Bu iki formattan biri - nokta ve hücre başına tablolar - kullandığınız istatistik programı tarafından beklenecektir.
whuber

1
Ah tamam. Ne demek istediğini anlıyorum. Sadece tüm hücreler için bir ızgara oluşturup birleştirmelisiniz. Yardım için teşekkürler.
horseoftheyear18

3

İstediğiniz şey, iki şekil dosyasını birbiriyle eşleştiren ve toplamı (sayı sayısı) sonuçta ortaya çıkan öznitelik tablosuna ayıran "Uzamsal Birleştirme" adı verilen temeldir. "Spatial Join in R" için arama yaparsanız, GIS.Stackexchange'te bile çok sayıda örnek bulacaksınız. Hızla googled ve örneğin bu kodu bir posta listesinde yayınlanan bulundu .

QGIS'de bir uzamsal öznitelik katılmak istiyorsanız, aşağıdakileri yapın:

  • .Shp dosyaları olarak şekiller (komut kaydet writeOGR rgdal paketinden)
  • Bunları QGIS'e yükleyin. MMQGIS eklentisi (Oluştur -> Izgara Katmanı Oluştur) aracılığıyla uygun ölçülere sahip vektör ızgarasını yeniden oluşturun.
  • Vektör -> Veri Yönetimi menüsünden "Özniteliklere Katıl" aracını kullanın. Nokta katmanınızın bir niteliğini seçin (bu, farklı çakışma olayları için DOĞRU (1) veya YANLIŞ (0) değerlerini temsil eden basit bir sütun olabilir).
  • Izgaranızı seçin ve tüm tekrarlamaları toplayın ve çalıştırın. Daha sonra ızgarayı Afrika kıtasının bir şekliyle de kırpardım.

Katıl bir şekilde başarısız olursa (benim için her zaman işe yaramazsa), SEXTANTE'a sadık kalın ve çok iyi birleştirme işlevlerine sahip SAGA araç kutusunu arayın.


Bu bir çözüm olmasına rağmen, noktaları bir ızgaraya özetlemenin sadece birkaç basit aritmetik işlemden ibaret olduğu göz önüne alındığında, özellikle karmaşık ve verimsiz bir çözümdür R. Shapefiles, rgdalQGIS ve Sextante kullanmak, birinin iki tahtayı birleştirmek için modern bir otomatik endüstriyel tesis kiralamasını tavsiye etmek gibi bir şey :-).
whuber

Bu yaklaşımı bu hafta sonu deneyeceğim. Yakın gelecekte, çeşitli şekil dosyalarını birbiriyle birleştirmek isteyebilirim, böylece bu yararlı olabilir. Girdi ve öneriler için teşekkürler.
horseoftheyear18

@whuber: Bu doğru, ancak çıktınızı dağıtmak ve belki stilize etmek istiyorsanız, o zaman bir şekil dosyası bariz seçimdir. Yine de, güzel R örneği!
Ocak'ta Curlew

Sonunda denedim. Ancak bu yaklaşımdaki sorun, çokgene yönelik tüm gözlemleri toplamasıdır. İdeal olarak, zaman içinde farklı olaylarla ilgili bilgileri tutmak istiyorum. Ama yanlış bir şey yapmış olabilirim.
horseoftheyear18
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.