Завантажені дані містять деякі відверті локальні помилки, тому перше, що потрібно зробити, - обмежити координати розумними значеннями:
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
коду),
Відтворюється (повторно повторюючи цей код),
Розширювані (шляхом зміни коду очевидними способами) та
Розумно швидко (на всю операцію потрібно 51052 спостережень).