2013-07-31 18 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