Загруженные данные содержат некоторые откровенные ошибки местоположения, поэтому первое, что нужно сделать, это ограничить координаты разумными значениями:
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))
Вычисление координат и идентификаторов ячеек сетки - это просто усечение десятичных знаков из значений широты и долготы. (В более общем случае для произвольных растров сначала отцентрируйте и масштабируйте их до единичного размера ячейки, урежьте десятичные дроби, а затем измените масштаб и верните их в исходное положение, как показано в коде ji
ниже.) Мы можем объединить эти координаты в уникальные идентификаторы, прикрепив их к входному фрейму данных, и запишите дополненный фрейм данных в виде файла CSV. Там будет одна запись на точку:
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)
Вместо этого вы могли бы хотеть вывод, который суммирует события в каждой ячейке сетки. Чтобы проиллюстрировать это, давайте посчитаем количество на ячейку и выведем по одной записи на ячейку:
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")
Для других сводок измените function
аргумент в вычислении counts
. (В качестве альтернативы используйте электронную таблицу или программное обеспечение базы данных, чтобы суммировать первый выходной файл по идентификатору ячейки.)
В качестве проверки давайте сопоставим счетчики, используя центры сетки, чтобы найти символы карты. (Точки, расположенные в Средиземном море, Европе и Атлантическом океане, имеют подозрительные местоположения: я подозреваю, что многие из них являются результатом смешения широты и долготы в процессе ввода данных.)
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")
Этот рабочий процесс сейчас
Тщательно документировано (посредством самого R
кода),
Воспроизводимый (путем повторного запуска этого кода),
Расширяемый (изменяя код очевидными способами), и
Разумно быстро (вся операция занимает менее 10 секунд для обработки этих 53052 наблюдений).