Os dados baixados contêm alguns erros de localização francos; portanto, a primeira coisa a fazer é limitar as coordenadas a valores razoáveis:
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))
O cálculo das coordenadas e identificadores das células da grade é apenas uma questão de truncar os decimais dos valores de latitude e longitude. (Em geral, para rasters arbitrários, primeiro centralize e dimensione-os para unidade de tamanho de célula, trunque as casas decimais e depois redimensione e atualize novamente a posição original, conforme mostrado no código ji
abaixo.) Podemos combinar essas coordenadas em identificadores exclusivos, anexando-os ao quadro de dados de entrada e grave o quadro de dados aumentado como um arquivo CSV. Haverá um registro por ponto:
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)
Você pode desejar uma saída que resuma eventos dentro de cada célula da grade. Para ilustrar isso, vamos calcular as contagens por célula e produzir essas, um registro por célula:
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")
Para outros resumos, altere o function
argumento no cálculo de counts
. (Como alternativa, use o software de planilha ou banco de dados para resumir o primeiro arquivo de saída pelo identificador de célula.)
Como verificação, vamos mapear as contagens usando os centros de grade para localizar os símbolos do mapa. (Os pontos localizados no Mar Mediterrâneo, na Europa e no Oceano Atlântico têm locais suspeitos: suspeito que muitos deles resultem da mistura de latitude e longitude no processo de entrada de dados.)
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")
Este fluxo de trabalho está agora
Completamente documentado (por meio do R
próprio código),
Reproduzível (executando novamente este código),
Extensível (modificando o código de maneiras óbvias) e
Razoavelmente rápido (toda a operação leva menos de 10 segundos para processar essas observações 53052).