I dati scaricati contengono alcuni errori di localizzazione franchi, quindi la prima cosa da fare è limitare le coordinate a valori ragionevoli:
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))
Il calcolo delle coordinate e degli identificatori delle celle della griglia consiste semplicemente nel troncare i decimali dai valori di latitudine e longitudine. (Più in generale, per i raster arbitrari, prima centra e ridimensionali in unità di dimensioni delle celle, tronca i decimali, quindi ridimensiona e torna alla loro posizione originale, come mostrato nel codice per ji
sotto.) Possiamo combinare queste coordinate in identificatori univoci, collegandoli al frame di dati di input e scrivendo il frame di dati aumentato come file CSV. Ci sarà un record per punto:
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)
Potresti invece voler un output che riassuma gli eventi all'interno di ogni cella della griglia. Per illustrare questo, calcoliamo i conteggi per cella e produciamo questi, un record per cella:
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")
Per altri riepiloghi, modificare l' function
argomento nel calcolo di counts
. (In alternativa, utilizzare un foglio di calcolo o un software di database per riepilogare il primo file di output in base all'identificatore di cella.)
Come controllo, mappiamo i conteggi utilizzando i centri della griglia per individuare i simboli della mappa. (I punti situati nel Mar Mediterraneo, in Europa e nell'Oceano Atlantico hanno posizioni sospette: sospetto che molti di essi derivino dalla confusione di latitudine e longitudine nel processo di immissione dei dati.)
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")
Questo flusso di lavoro è ora
Completamente documentato (tramite il R
codice stesso),
Riproducibile (rieseguendo questo codice),
Estensibile (modificando il codice in modi ovvi), e
Abbastanza veloce (l'intera operazione richiede meno di 10 secondi per elaborare queste 53052 osservazioni).