轻松分配和使用Spatial * DataFrame的数据值

时间:2013-07-31 19:12:57

标签: r spatial gstat spatial-data-frame

是否有可能以某种方式轻松处理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中必须要容易得多!

2 个答案:

答案 0 :(得分:6)

你可以这样做:

meuse$zinc[1] <- NA 

或者更好,因为你可以使用变量名而不是文字:

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

似乎没有提供其他途径作为方法,但可以添加它们。我不确定为什么会出现这种情况,但最初*DataFrame部分在AttributeList中构建为sp,因为R的实际data.frame效率低于当时的rownames ,但这是古老的历史,现在都已修复。

您可以预期这些会起作用,就像普通的data.frame一样,但它们不会:

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

如果可以,最好避免使用@运算符,因为开发人员隐藏在他们提供给用户的代码中,即如果不使用提供的方法,则会破坏他们的API。它没有大的危险,除了开发人员可能会改变API并且你的代码不起作用,你可能通过修改一个部分而不是另一个部分来破坏对象,因为你不应该使用对象的设计方式除了私人或代码,你积极维护(我认为在这种情况下它是安全的,但如果可以的话,通常会避免它)。请参阅?“@”和?“slot”了解基础知识。

答案 1 :(得分:5)

对于Spatial * DataFrame对象,您可以使用“@data”访问data.frame插槽,并且通常的data.frame操作应该有效。使用您的示例,

 meuse@data[1, 'zinc'] <- NA

给出

 str(meuse@data)
'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 ...
 ...