Tổng hợp các điểm vào lưới bằng R


14

Tôi có một câu hỏi liên quan đến tập hợp không gian trong R. Điều tôi đang cố gắng làm là tổng hợp một tập dữ liệu điểm vào lưới. Tuy nhiên tôi không chắc chắn làm thế nào để làm điều này vì tôi có ít kinh nghiệm với loại công cụ này. Tôi đã hy vọng bất cứ ai trong số bạn có thể có một số hướng dẫn hữu ích / một giải pháp khả thi.

Điểm thuận lợi của tôi là một bộ dữ liệu chứa dữ liệu tham chiếu địa lý về các sự kiện xung đột ở Châu Phi (xem www.acleddata.com). Các điểm được tham chiếu địa lý với tọa độ vĩ độ / kinh độ và chứa dữ liệu về loại sự kiện và thời gian. Những gì tôi muốn làm là tổng hợp các điểm này thành một lưới 1x1 độ.

Do đó, một ô lưới sẽ chứa thông tin của các điểm dữ liệu nếu một sự kiện xảy ra trong ô lưới đó. Sản phẩm cuối cùng của cái này phải là khung dữ liệu hoặc thứ gì đó mà tôi có thể xuất sang tệp csv vì dữ liệu dự định sẽ được sử dụng trong tập dữ liệu bảng để phân tích thống kê.

Cho đến nay tôi đã tải và vẽ dữ liệu và shapefile bằng mã bên dưới. Tôi tin rằng tôi nên sử dụng chức năng over từ gói sp để tổng hợp nhưng tôi không biết làm thế nào. Hy vọng một trong các bạn có thể giúp đỡ.

Mã tôi đã sử dụng cho đến nay có thể được tìm thấy ở đây với kết quả hình ảnh tương ứng ở đó .

Đề nghị làm điều này trong QGIS cũng được chào đón.


Đây là một hoạt động đơn giản nhanh chóng không đòi hỏi gì nhiều hơn một chút số học. Nhưng định dạng nào bạn muốn đầu ra? "CSV" chỉ gợi ý rằng nó phải là một bảng quan hệ, nhưng điều này đưa ra một vấn đề: khi bạn tổng hợp, mỗi ô sẽ có khả năng tương ứng với một số điểm khác nhau . Thông thường, bạn chọn một trong hai tùy chọn: bạn xuất một bản ghi cho mỗi điểm (bao gồm ID của ô chứa nó) hoặc bạn xuất một bản ghi cho mỗi ô và bao gồm một số tóm tắt thống kê về các điểm mà nó chứa. Bạn cần cái nào
whuber

1
Xin lỗi tôi đã không xác định điều đó. Những gì tôi cần là một bản ghi cho mỗi tế bào . Tôi sử dụng tệp csv để tạo dữ liệu bảng ở định dạng năm ô .
Horseoftheyear

Câu trả lời:


12

Dữ liệu khi được tải xuống chứa một số lỗi vị trí thẳng thắn, do đó, điều đầu tiên cần làm là giới hạn tọa độ ở các giá trị hợp lý:

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))

Việc tính toán tọa độ và số nhận dạng ô lưới chỉ là vấn đề cắt bớt các số thập phân từ các giá trị vĩ độ và kinh độ. (Nói chung, đối với các trình quét tùy ý, trước tiên, trung tâm và chia tỷ lệ chúng thành đơn vị tế bào, cắt bớt các số thập phân, sau đó nối lại và lấy lại vị trí ban đầu của chúng, như được hiển thị trong mã cho jibên dưới.) Chúng ta có thể kết hợp các tọa độ này thành các định danh duy nhất, đính kèm chúng vào khung dữ liệu đầu vào và viết khung dữ liệu tăng thêm ra dưới dạng tệp CSV. Sẽ có một bản ghi cho mỗi điểm:

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)

Thay vào đó, bạn có thể muốn đầu ra tóm tắt các sự kiện trong mỗi ô lưới. Để minh họa điều này, hãy tính tổng số trên mỗi ô và xuất ra số đó, một bản ghi cho mỗi ô:

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")

Đối với các tóm tắt khác, thay đổi functionđối số trong tính toán của counts. (Cách khác, sử dụng bảng tính hoặc phần mềm cơ sở dữ liệu để tóm tắt tệp đầu ra đầu tiên theo mã định danh ô.)

Để kiểm tra, hãy ánh xạ số đếm bằng cách sử dụng các tâm lưới để xác định vị trí các ký hiệu bản đồ. (Các điểm nằm ở Biển Địa Trung Hải, Châu Âu và Đại Tây Dương có các vị trí đáng ngờ: Tôi nghi ngờ nhiều trong số chúng là do trộn lẫn vĩ độ và kinh độ trong quá trình nhập dữ liệu.)

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")

Bản đồ châu phi

Quy trình này hiện đang

  • Tài liệu kỹ lưỡng (bằng Rchính mã),

  • Tái sản xuất (bằng cách chạy lại mã này),

  • Mở rộng (bằng cách sửa đổi mã theo những cách rõ ràng) và

  • Nhanh chóng hợp lý (toàn bộ hoạt động chỉ mất chưa đến 10 giây để xử lý 53052 quan sát này).


Mã là hoàn toàn tái sản xuất. Tôi có một câu hỏi bổ sung mặc dù. Thay vì tóm tắt, làm cách nào để đính kèm thông tin từ tệp dữ liệu đầu vào vào ô trong lưới đã tạo?
Horseoftheyear

1
Điều đó là không thể với bảng đầu ra , vì thông tin đầy đủ cho các ô có độ dài thay đổi. Cách thích hợp để ghi lại đó là với hình thức đầu ra đầu tiên tôi đã trình bày: một bản ghi cho mỗi điểm với thuộc tính định danh ô. Một trong hai định dạng này - bảng mỗi điểm và mỗi ô - sẽ được mong đợi bởi bất kỳ chương trình thống kê nào bạn đang sử dụng.
whuber

1
À được rồi Tôi hiểu ý bạn là gì. Chỉ phải tạo một lưới cho tất cả các ô và hợp nhất nó. Cảm ơn đã giúp đỡ.
Horseoftheyear

3

Chà, thứ bạn muốn là một thứ cơ bản được gọi là "Spatial Join", khớp hai shapefile với nhau và phân bổ tổng (số đếm) cho bảng thuộc tính kết quả. Nếu bạn tìm kiếm "Spatial Join in R", bạn sẽ tìm thấy rất nhiều ví dụ ngay cả ở đây trên GIS.Stackexchange. Tôi nhanh chóng googled và tìm thấy ví dụ này được đăng trên một danh sách gửi thư.

Nếu bạn muốn đạt được một thuộc tính không gian tham gia vào QGIS, thì hãy làm như sau:

  • Lưu hình dạng của bạn dưới dạng tệp .shp (lệnh writeOGR từ gói rgdal)
  • Tải chúng trong QGIS. Tái tạo lưới vector của bạn thông qua plugin MMQGIS (Tạo -> Tạo lớp lưới) với tỷ lệ thích hợp.
  • Sử dụng công cụ "Tham gia thuộc tính" từ menu Vector -> Quản lý dữ liệu. Chọn một thuộc tính của lớp điểm của bạn (đây có thể là một cột đơn giản biểu thị các giá trị TRUE (1) hoặc FALSE (0) cho các sự kiện xung đột khác nhau).
  • Chọn lưới của bạn và Sum tất cả các lần xuất hiện và thực hiện. Sau đó tôi cũng sẽ cắt lưới của bạn với hình dạng của lục địa châu Phi.

Nếu Tham gia bằng cách nào đó không thành công (không hoạt động với tôi mọi lúc), hãy bám vào SEXTANTE và tìm hộp công cụ SAGA, cũng có chức năng tham gia rất tốt.


Mặc dù đây là một giải pháp, nhưng nó là một giải pháp đặc biệt phức tạp và không hiệu quả khi cho rằng việc tóm tắt các điểm vào lưới chỉ là vấn đề của một vài phép tính số học đơn giản, Rvượt trội. Sử dụng shapefiles, rgdalQGIS và Sextante giống như khuyến nghị ai đó thuê một nhà máy công nghiệp tự động hiện đại để đóng hai tấm ván lại với nhau :-).
whuber

Tôi sẽ thử phương pháp này vào cuối tuần này. Trong tương lai gần, tôi có thể muốn kết hợp các tệp hình dạng khác nhau với nhau để điều này có thể hữu ích. Cảm ơn cho đầu vào và các đề xuất.
Horseoftheyear

@whuber: Đúng vậy, nhưng nếu bạn muốn phân phối và có thể định kiểu đầu ra của mình, thì một shapefile là lựa chọn rõ ràng. Tuy nhiên, ví dụ R tốt đẹp!
Curlew

Cuối cùng tôi đã thử nó. Nhưng vấn đề với cách tiếp cận này là nó tổng hợp tất cả các quan sát cho đa giác. Trong khi tôi lý tưởng muốn giữ thông tin về các sự kiện khác nhau theo thời gian. Nhưng nó có thể là tôi đã làm điều gì đó sai.
Horseoftheyear
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.