R을 사용하여 점을 그리드로 집계


14

R의 공간 집계와 관련하여 질문이 있습니다. 수행하려는 것은 점 데이터 세트를 그리드에 집계하는 것입니다. 그러나 이런 종류의 경험이 거의 없기 때문에 어떻게 해야하는지 잘 모르겠습니다. 나는 당신 중 누군가가 유용한 지침 / 가능한 해결책을 갖기를 바랍니다.

저의 유리한 점은 아프리카 충돌 사건에 대한 지리 참조 데이터를 포함하는 데이터 세트입니다 (www.acleddata.com 참조). 포인트는 위도 / 경도 좌표로 지리 참조되며 이벤트 유형 및 시간에 대한 데이터를 포함합니다. 내가하고 싶은 것은이 점을 1x1도 격자로 집계하는 것입니다.

따라서 그리드 셀 내에서 이벤트가 발생한 경우 그리드 셀에는 데이터 포인트의 정보가 포함되어야합니다. 이 데이터의 최종 결과는 데이터가 통계 분석을 위해 패널 데이터 세트에서 사용되도록 의도 된 데이터 프레임 또는 csv 파일로 내보낼 수있는 것이어야합니다.

지금까지 아래 코드를 사용하여 데이터와 shapefile을로드하고 플로팅했습니다. sp 패키지 의 over 함수를 사용하여 집계 해야한다고 생각 하지만 방법을 모르겠습니다. 당신 중 하나가 도울 수 있기를 바랍니다.

지금까지 사용 된 코드를 찾을 수 있습니다 여기 를 통해 해당 시각적 인 결과 .

QGIS에서이를 수행하기위한 제안도 환영합니다.


이것은 약간의 산술 만 필요로하는 빠르고 간단한 연산입니다. 그러나 어떤 형식으로 출력을 원하십니까? "CSV"는 관계형 테이블이어야 함을 시사하지만 문제가됩니다. 집계 할 때 각 셀은 다양한 포인트 수에 해당합니다 . 일반적으로 두 가지 옵션 중 하나를 선택 : 당신도 출력 당 하나 개의 레코드 (자사 포함하는 셀의 ID 포함) 또는 출력 한 당 기록 세포 와는 포함 된 점의 몇 가지 통계 요약을 포함한다. 어느 것이 필요합니까?
whuber

1
죄송합니다. 지정하지 않았습니다. 내가 필요한 것은 셀당 하나의 레코드입니다 . csv 파일을 사용하여 셀 년 형식의 패널 데이터를 만듭니다 .
horseoftheyear

답변:


13

다운로드 된 데이터에는 일부 위치 오류가 포함되어 있으므로 가장 먼저해야 할 일은 좌표를 합리적인 값으로 제한하는 것입니다.

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코드 자체를 통해) 철저히 문서화

  • 재현 가능 (이 코드를 다시 실행하여)

  • (확실한 방법으로 코드를 수정하여) 확장 가능

  • 상당히 빠름 (전체 53052 관측 값을 처리하는 데 10 초 미만이 소요됨)


코드는 완벽하게 재현 가능합니다. 그래도 하나 더 질문이 있습니다. 요약 대신 입력 데이터 파일의 정보를 작성된 그리드 의 에 어떻게 첨부 합니까?
horseoftheyear

1
셀에 대한 전체 정보의 길이는 가변적이기 때문에 출력 테이블 과는 관련이 없습니다 . 첫 번째 출력 형식으로 기록하는 올바른 방법 : 셀 식별자 속성이있는 포인트 당 하나의 레코드. 이 두 가지 형식 중 하나 (포인트 당 및 셀당 테이블)는 사용중인 통계 프로그램에 따라 예상됩니다.
whuber

1
그래. 무슨 말인지 알 겠어 모든 셀에 대한 그리드를 작성하고 병합하기 만하면됩니다. 도와 주셔서 감사합니다.
horseoftheyear

3

글쎄, 당신이 원하는 것은 두 개의 shapefile을 서로 일치시키고 결과 속성 테이블에 합계 (카운트 번호)를 할당하는 "공간 결합"이라는 기본입니다. "Spatial Join in R"을 검색하면 GIS.Stackexchange에서도 많은 예제를 찾을 수 있습니다. 예를 들어이 코드 가 메일 링리스트에 게시 된 것을 빠르게 검색했습니다 .

QGIS에서 공간 속성 조인을 달성하려면 다음을 수행하십시오.

  • .shp 인 파일로 당신의 모양 (명령 저장 writeOGR rgdal 패키지)
  • QGIS에로드하십시오. 적절한 스케일링으로 MMQGIS 플러그인 (Create-> Create Grid Layer)을 통해 벡터 그리드를 다시 생성하십시오.
  • Vector-> Data Management 메뉴에서 "Join Attributes"도구를 사용하십시오. 포인트 레이어의 속성을 선택합니다 (이는 다른 충돌 이벤트에 대한 TRUE (1) 또는 FALSE (0) 값을 나타내는 간단한 열일 수 있음).
  • 그리드를 선택하고 모든 발생을 합산하고 실행하십시오. 나중에 나는 또한 아프리카 대륙의 모양으로 그리드를자를 것입니다.

어떻게 든 조인이 실패하면 (매번 나에게 작동하지는 않음) SEXTANTE를 고수하고 SAGA 도구 상자를 찾으십시오.이 도구는 매우 우수한 결합 기능을 가지고 있습니다.


이것이 해결책이지만 그리드에 점을 요약하는 것이 몇 가지 간단한 산술 연산의 문제라는 점을 감안할 때 특히 복잡하고 비효율적 R입니다. shapefiles, rgdalQGIS 및 Sextante를 사용하는 것은 누군가가 두 개의 보드를 함께 고정하기 위해 현대 자동화 산업 플랜트를 고용하는 것을 권장하는 것과 같습니다.
whuber

이번 주말에이 방법을 시도해 보겠습니다. 가까운 장래에 다양한 모양 파일을 서로 결합하여 유용 할 수 있습니다. 의견과 제안에 감사드립니다.
horseoftheyear

@ whuber : 사실이지만, 출력을 분배하고 스타일을 지정하려면 shapefile이 확실한 선택입니다. 그럼에도 불구하고, 좋은 R 사례!
Curlew

나는 마침내 그것을 시도했다. 그러나이 방법의 문제점은 모든 관측 값을 다각형에 합산한다는 것입니다. 이상적으로 시간이 지남에 따라 다른 이벤트에 대한 정보를 유지하고 싶습니다. 그러나 내가 잘못한 것일 수 있습니다.
horseoftheyear
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.