Pobrane dane zawierają pewne szczere błędy lokalizacyjne, więc pierwszą rzeczą do zrobienia jest ograniczenie współrzędnych do rozsądnych wartości:
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))
Obliczenie współrzędnych i identyfikatorów komórki siatki jest jedynie kwestią obcięcia liczb dziesiętnych od wartości szerokości i długości geograficznej. (Mówiąc bardziej ogólnie, w przypadku dowolnych rastrów najpierw wyśrodkuj je i skaluj, aby dopasować do rozmiaru komórki, skróć dziesiętne, a następnie przeskaluj i ponownie wyśrodkuj z powrotem do ich pierwotnej pozycji, jak pokazano w poniższym kodzie ji
.) Możemy połączyć te współrzędne w unikalne identyfikatory, dołączając je do wejściowej ramki danych i zapisz rozszerzoną ramkę danych jako plik CSV. Będzie jeden rekord na punkt:
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)
Zamiast tego możesz chcieć wyników podsumowujących zdarzenia w każdej komórce siatki. Aby to zilustrować, obliczmy liczby na komórkę i wyprowadzamy je, jeden rekord na komórkę:
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")
W przypadku innych podsumowań zmień function
argument w obliczeniach counts
. (Ewentualnie użyj arkusza kalkulacyjnego lub oprogramowania bazy danych, aby podsumować pierwszy plik wyjściowy według identyfikatora komórki).
W celu sprawdzenia, niech map liczniki za pomocą siatki centrów zlokalizować symbole na mapach. (Punkty położone na Morzu Śródziemnym, w Europie i na Oceanie Atlantyckim mają podejrzane lokalizacje: podejrzewam, że wiele z nich wynika z pomieszania szerokości i długości geograficznej w procesie wprowadzania danych.)
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")
Ten przepływ pracy jest teraz
Dokładnie udokumentowane (za pomocą samego R
kodu),
Powtarzalne (przez ponowne uruchomienie tego kodu),
Rozszerzalny (poprzez modyfikację kodu w oczywisty sposób), oraz
Dość szybko (cała operacja zajmuje mniej niż 10 sekund na przetworzenie tych 53052 obserwacji).