R의 SpatialPointsDataFrame 속성 및 연산자


14

R SpatialPointsDataFramesp패키지를 사용하여 유형의 객체를 만들었습니다 . 그러나 @, $, . and []연산자와 객체를 사용하여 객체의 다른 속성에 액세스하는시기에 대해 혼란 스럽 습니다. 내 샘플 코드는 다음과 같습니다.

library(sp)
library(rgdal)

#creating a SpatialPointsDataFrame with sample points in UTM
x <- c(15.2, 15.3, 15.4, 15.5, 15.7)
y <- c(50.4, 50.2, 50.3, 50.1, 50.4)
v1 <- c(1.0, 2.0, 3.0, 4.0, 5.0)
v2 <- c("a","b","b","c","a")
attributes <- as.data.frame(cbind(v1,v2))
xy <- cbind(x,y)
locationsDD <- SpatialPointsDataFrame(xy, attributes)
proj4string(locationsDD) <- CRS("+proj=longlat")
locations <- spTransform(locationsDD, CRS("+proj=utm +zone=33"))
plot(locations)

#using the different operators: WHEN TO USE @, $ or [] ?

#all these work!
property1 <- locations$v1
property2 <- locations@data$v1
property3 <- locations@data[,"v1"]
property4 <- locations@data["v1"]

#these also work
property5 <- locations@coords
property6 <- locations@bbox
property7 <- locations@coords[,2]

#these three work only in my special case
property8 <- locations@coords[,"y"]
property9 <- locations$x
property10 <- locations$y

#these don't work: $ operator is invalid for atomic vectors
property11 <- locations@coords$x
property12 <- locations@coords$y

누가 @, $, []연산자 를 사용할 때 나를 도울 수 있습니까? 나는이 문서를 읽을 때 ?SpatialPointsDataFrame나는 같은 다른 속성 볼 수 있습니다 coords또는 bbox그러나 나는 어떤 운전자 혼동하고있어 @, $, []접근로를 사용하는 방법을하거나 수정합니다.


1
이것은 실제로 R구문에 대한 질문이므로 sp패키지 또는 해당 오브젝트 에만 국한되지는 않습니다 . R튜토리얼과 함께 설치됩니다 : 당신의 연구에서 시작하십시오. 웹과 인쇄 매체는 학습을위한 풍부한 추가 리소스를 제공합니다 R.
whuber

답변:


21

공간 sp 데이터는 S4 클래스 객체이며 표현되는 공간 피쳐 클래스의 구성 요소를 포함하는 슬롯 (@을 사용하여 호출)으로 구성됩니다 (예 : @data에는 속성이 포함되고 @coords에는 좌표 쌍이 포함됨 등). slotNames ()를 사용하여 최상위 수준 슬롯 이름을 반환 할 수 있지만 반복적이지 않으며 다각형 클래스 객체에 대해 중첩 된 슬롯 이름을 반환하지 않습니다. 각 슬롯은 다른 객체 클래스를 포함 할 수 있으며, 작동하기 전에 str () 또는 class ()를 사용하여 확인해야합니다. @data 슬롯은 항상 data.frame 객체이고 @coords는 행렬 인 반면 @polygons는 추가 슬롯 (랩랩, 영역, 구멍, ringDir 및 좌표)이있는 목록 객체입니다.

사용 가능한 슬롯과 슬롯의 구성은 표현되는 피처 클래스 유형에 따라 다릅니다. SpatialPointsDataFrame 객체가 가장 기본 인 반면 SpatialPolygonsDataFrame 객체에는 중첩이 있습니다 (위 참조). 각 다각형을 나타내는이 중첩 구조는 각 목록 객체 (다각형)에서 작동하기 위해 sapply와 같은 것을 사용해야합니다.

다음은 sapply를 사용하여 "다각형"과 중첩 된 "영역"슬롯을 반복하여 각 다각형의 영역을 반환하는 예입니다.

sapply(slot(sdat, 'polygons'), function(i) slot(i, 'area')) 

다각형 객체의 경우 각 다각형의 목록으로 저장되므로 목록 색인을 사용할 수도 있습니다. 다음은 첫 번째 다각형 (SpatialPolygonsDataFrame이 아닌 "Polygon"클래스 객체에 결과)을 반환하는 예제입니다.

sdat@polygons[[1]]

더 최신 버전의 sp에서는 개발자가 @data 슬롯을 직접 호출 할 필요가없는 경우가있었습니다.

예를 들어, @data를 색인화하려면 다음을 수행하십시오.

sdat@data[sdat@data$att >= 0.5 ,]  

그리고 지금:

sdat[sdat$att >= 0.5 ,]

그러나 앞에서 설명한 것처럼 다른 슬롯 (예 : 좌표, 다각형 등)에는 해당되지 않습니다. [] 또는 $를 사용할 때까지는 여전히 조작 유형에 따라 다릅니다. 대괄호 "[]"는 데이터 프레임에서 이름을 호출하는 데 사용될 수 있지만 주로 인덱싱에 사용되는 반면 $는 데이터 프레임에서 열을 호출하는 데 특히 사용됩니다. 열 이름에 대한 "간접적 인"호출이 작동하는 이유는 개발자가 sp 개체를 통한 재귀 적 검색을 허용하는 기능을 추가했기 때문입니다. 그러나 이름 충돌을 피하기 위해 (예 : 데이터 프레임에 x, y 열이 @coord 매트릭스 이름의 x, y 이름과 충돌 함) 일부 일관성있는 이유를 설명하는 내부 일관성 검사가 있습니다. 인스턴스.

편리한 특징 중 하나는 행 인덱스를 통해 공간 객체를 부분 집합화할 수 있다는 것입니다. 여기에서는 처음 10 개의 객체를 하위 설정합니다.

sub.sdat <- sdat[1:10,] 

또는 대안 적으로, 행 인덱스 벡터를 사용하는 랜덤 샘플 (n = 10).

rs.sdat <- sdat[sample(1:nrow(sdat), 10),]

R 코드 작성에서 색인 작성 및 대괄호 사용 방법을 이해하는 것이 매우 중요합니다.

편집 (03/24/2017) : GeoJSON 표준을 따르는 단순 피쳐 (sf) 클래스는 아마도 R의 공간 객체에 대한 새로운 표준이 될 것입니다. CRAN sf에서이 클래스에 대한 자세한 설명을 읽을 수 있습니다. 웹 사이트 R의 간단한 기능 .


무대 뒤에서 일어나는 일에 대한 자세한 설명을 주셔서 감사합니다. 위한 것으로 보인다 SpatialPointsDataFrame뿐만 아니라 @data 열뿐만 아니라 @coords 열이 함께 검색 할 수 $@coords 슬롯을 호출 할 필요없이 오퍼레이터. 따라서 sdat@coords$easting와 동일한 결과를 제공합니다 sdat$easting.
jirikadlec2

<at> data에서 열을 호출하는 것 같습니다. 이것은 <at> coords 슬롯과 동일하지 않습니다. colnames (sdat <at> coords)를 호출하면 행렬 열 이름 "coords.x1", "coords.x2"가 반환됩니다. 데이터 프레임에 좌표를 유지할 필요가 없으며, 복제되기 때문에 메모리 허리가 필요합니다.
Jeffrey Evans

아니요. <at> 데이터에서 열을 호출하지 않습니다. 샘플 스크립트에서 SpatialPointsDataFrame을 사용하면을 colnames(locations@coords)반환 [1] "x" "y"하지만을 colnames(locations@data)반환합니다 [1] "v1" "v2". 어쩌면 SpatialPointsDataFrame을 만드는 데 사용 된 함수에 따라 동작이 달라질 수 있습니까?
jirikadlec2

사실 나는 첫 번째 의견에 실수가 있습니다. sdat@coords$eastingsdat @ coords가 행렬이기 때문에 작동하지 않습니다. 그러나 sdat@coords[,"easting"]와 동일 sdat@coords[,1]합니다 sdat$easting.
jirikadlec2

한 가지 경고 인 colnames ()는 행렬에서 열 이름을 반환하는 데 사용되는 반면 names ()는 NULL을 반환합니다. 비록 names ()와 colnames ()는 <at> data와 같은 데이터 프레임 객체에서 작동합니다. <at> coord 매트릭스에서 데이터를 검색하는 가장 좋은 방법은 sdat <at> coords [, 1] 또는 sdat <at> coords [, "coords.x1"] 열 이름으로 인덱싱하는 것입니다. 매트릭스 객체이므로 작동하지 않습니다.
Jeffrey Evans

4

str(locations)이것을 명확히 하려고 노력해야 합니다.

예를 들어, 다음은 올바른 것입니다.

property2 <- locations@data$v1
property5 <- locations@coords
property6 <- locations@bbox
property7 <- locations@coords[,"x"]
property8 <- locations@coords[,2]

그리고 이것은 property1 <- locations$v1@data 내의 위치 data.frame을 참조하기 때문에 작동합니다.


str(locations)나에게 좋은 힌트를 주었다. 이제는 @"클래스 슬롯"에 사용됩니다. 그러나 나는 여전히 열이 포함되지 않은 property9 <- locations$x경우 왜 작동 하는지 이해 names(locations)하지 못합니다x
jirikadlec2

1
SpatialPointDataFrame을 작성할 때 x와 y를 좌표 이름으로 지정합니다. location @ coords를 보면 좌표가있는 행렬을 볼 수 있습니다. 또한 이름이 "x"인 @data에 새 열을 만들려고하면 이미 좌표 이름으로 사용되므로 열을 만들 수 없습니다.
기예르모 올 메도

나는 여전히 SpatialPointsDataFrame객체가 $연산자 와의 좌표에 액세스하기 위해 어떤 종류의 '매직'을 사용 하는지 알지 못합니다 . 그러나 적어도 지금은 그것을 사용하는 것이 더 편안합니다. 다음 코드를 colnames(locations@coords) <- c("easting","northing") 실행했습니다. 실행 한 후 locations$eastingx 좌표 벡터를 locations$northing제공하고 y 좌표 벡터를 제공합니다.
jirikadlec2

R은 좌표에 대한 두 개의 열을 SpatialPointsDataFrame의 데이터 프레임 부분에 대한 두 개의 열로 간주합니다. 그렇기 때문에 @data 슬롯 안에 같은 이름의 열을 가질 수 있습니다.
Guillermo Olmedo

1
@coords행렬 에서 열의 이름은 개체가 SpatialPointsDataFrame어떻게 SpatialPointsDataFrame만들어 졌는지 에 달려 있습니다. 방법 1 : coordinates(sdat) <- x ~ y열 이름을로 바꿉니다 "coords.x1", "coords.x2". 방법 2 : 행렬 sdat <- SpatialPointsDataFrame(xy, attributes)의 원래 열 이름을 유지합니다 xy.
jirikadlec2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.