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