2013-07-31 4 views
2

Spatial*DataFrame (* = Points, Lines, Polygons, Pixels, Grid, ...)의 데이터로 어떻게 든 쉽게 작업 할 수 있습니까? 두 경우 모두에 대한Spatial * DataFrame의 데이터 값을 쉽게 지정하고 사용할 수 있습니다

require(gstat) 
data(meuse) 
coordinates(meuse) = ~x+y 
data(meuse.grid) 
gridded(meuse.grid) = ~x+y 

######## 1) assigning value 

meuse[1,'zinc'] <- NA 
# Error in meuse[1, "zinc"] <- NA : object of type 'S4' is not subsettable 
as.data.frame(meuse)[1,'zinc'] <- NA 
# Error in as.data.frame(meuse)[1, "zinc"] <- NA : 
# could not find function "as.data.frame<-" 

######## 2) operating with values 

meuse[, 'zinc'] + 2 
# Error in meuse[, "zinc"] + 2 : non-numeric argument to binary operator 

내가 찾은 꽤 추한 해결 방법 : 특히 나는 그것에 값을 할당하고 그들과 함께 운영에 어려움이

# ad 1) 
meuse2 <- as.data.frame(meuse) 
meuse2[1, 'zinc'] <- NA 
meuse2 <- SpatialPointsDataFrame(SpatialPoints(meuse), meuse2) 

# ad 2) 
as.data.frame(meuse)[, 'zinc'] + 2 

그러나이 그냥 초보자 시도, 너무하다 추악하고 복잡한 ... R에서 훨씬 쉬워야합니다!

+1

meuse $ zinc [1] <- NA 다른 경로가 메소드로 제공되지 않았지만 추가 될 수 있습니다. 나는 그것에 대해 살펴볼 것이다. 여러분은 meuse [1, 'zinc'] <- NA, meuse [1,] [zinc]] NA 그리고 meuse [1,] $ zinc <- NA가 모두 작동해야합니다. 가능한 경우 @ 연산자를 사용하지 않는 것이 가장 좋습니다. – mdsumner

+1

또한이 작업을 통해 $ : meuse [[ 'zinc']] [1] <- NA – mdsumner

+0

@mdsumner, 와우, 많은 가능성을 피할 수 있습니다! 하지만'@ '연산자에 대해 어떻게 말합니까? 왜 그것을 피해야합니까? 이것은 흥미롭지 만 중요해 보입니다. 자신의 답변으로 게시하십시오! – TMS

답변

5

Spatial * DataFrame 개체의 경우 '@ 데이터'를 사용하여 data.frame 슬롯에 액세스 할 수 있으며 일반적인 data.frame 작업이 작동합니다. 당신이 변수 이름을 사용할 수 있기 때문에 문자보다는 더 나은

meuse$zinc[1] <- NA 

나 : 귀하의 예제를 사용하여,

[email protected][1, 'zinc'] <- NA 

str([email protected]) 
'data.frame': 155 obs. of 12 variables: 
$ cadmium: num 11.7 8.6 6.5 2.6 2.8 3 3.2 2.8 2.4 1.6 ... 
$ copper : num 85 81 68 81 48 61 31 29 37 24 ... 
$ lead : num 299 277 199 116 117 137 132 150 133 80 ... 
$ zinc : num NA 1141 640 257 269 ... 
... 
+0

그게 내가 오래 sooo를 놓친거야, 고마워! – TMS

5

당신은 다음과 같이이 작업을 수행 할 수 있습니다

aname <- 'zinc' 
meuse[[aname]][1] <- NA 

다른 경로 이 메소드는 메소드로 제공되지 않지만 추가 될 수 있습니다. 이유는 모르겠지만 원래 *DataFrame 부분은 AttributeListsp으로 작성 되었기 때문에 R의 실제 data.frame은 당시의 rownames와 비효율적 이었지만 지금은 고 대 역사이며 모두 고정되어 있습니다.

당신이 정상적인 data.frame 같은 일 것이라고 기대할 수 있지만, 그렇지 않은 :

meuse[1,'zinc'] <- NA 
meuse[1,][['zinc']] <- NA 
meuse[1,]$zinc <- NA 

그것은 @ 연산자 당신이 할 수있는 경우를 피하기 위해 아마도 최선의 개발자가 코드 안에 숨길 것이 있기 때문에 그들은 사용자에게 제공합니다. 즉 제공된 메소드를 사용하지 않으면 API를 파괴합니다. 개발자가 API를 변경할 수 있고 코드가 작동하지 않는다는 점과 객체가 디자인 된 방식으로 한 부분 만 수정하여 객체가 손상 될 수 있다는 점을 제외하면 엄청난 위험은 없습니다. 따라서 사용하지 않아야합니다. 그것은 개인적으로 또는 코드를 제외하고는 적극적으로 유지합니다 (이 경우에는 안전하지만 일반적으로 가능하면 피하는 것이 좋습니다). "@"및 ""슬롯 "을 참조하십시오.

+0

감사!1) 그래서 그 3 문장이 작동하지 않는 버그라고 생각합니까? 누군가 그것을 고칠 수 있습니까? 2)는'Spatial * DataFrame'의'@ data' 기능이 어딘가에 기록되어 있습니까? 이것을 사용하는 것이 타당한 기준으로 삼을 수 있습니다. 그것들은 또한'df [[ 'zinc']] [1]'[intro_sp vignette] (http://cran.r-project.org/web/packages/sp/vignettes/intro_sp.pdf) . – TMS

+0

이 "더 많은"올바른 방식으로 내가 싫어하는 것은 이것이 내가 일반적으로 data.frames를 사용하는 방식이 아니라는 것입니다. 'df @ data [1, 'zinc']'는 내가 일반적으로 사용하는 것에 가깝다. 더 중요한 것은'@data' **로 여러 개의 컬럼을 이름이나 인덱스로 인덱스하는 데이터 프레임으로 작업 할 수 있다는 것입니다 : **'meuse @ data [, c ('zinc', 'cadmium')]'unfortunatelly would 'meuse []] 형식에서는 작동하지 않습니다. – TMS

+0

이것은 sp 1.0-12에서 소개 된 meuse [1, 'zinc'] <- NA가 작동합니다. – mdsumner