2013-07-31 19 views
2

是否有可能以某種方式輕鬆處理Spatial*DataFrame(* =點,線,多邊形,像素,網格...)中的數據?特別是我有指定值,並與他們一起工作的困難:輕鬆分配和使用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看起來,其他途徑並不作爲方法提供,但可以添加。我會看看那個。你可以預料到這種情況[1,'鋅'] < - NA,小心[1,] [['''']] - - NA,以及[1,] $鋅< - NA都應該工作。如果可以的話,最好避免使用@運算符。 – mdsumner

+1

另外這個工程,所以你可以避免$:meuse [['鋅']] [1] < - NA – mdsumner

+0

@mdsumner,哇,這麼多的可能性!但是你怎麼說'@'操作符,爲什麼我應該避免它?這不僅有趣,而且看起來很重要;請張貼它作爲你自己的答案! – TMS

回答

5

對於Spatial * DataFrame對象,您可以使用'@data'訪問data.frame插槽,並且通常的data.frame操作應該可以工作。使用你的榜樣,

[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

這就是我一直想念的很久,謝謝! – TMS

5

你可以做到這一點是這樣的:

meuse$zinc[1] <- NA 

,或者更好,因爲你可以使用一個變量名,而不是字面:

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

似乎其他途徑這不是作爲方法提供的,但可以添加它們。我不確定爲什麼會出現這種情況,但最初的*DataFrame零件是在sp中構建爲AttributeList,因爲當時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')]'''''''''不在'meuse [[]]'形式工作。 – TMS

+0

現在這個工作沒有用[1,'鋅'] < - NA在sp 1.0-12中引入 – mdsumner