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

TMS*_*TMS 2 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
Run Code Online (Sandbox Code Playgroud)

我发现这两种情况都有相当难看的变通办法:

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

# ad 2)
as.data.frame(meuse)[, 'zinc'] + 2
Run Code Online (Sandbox Code Playgroud)

但这些只是初学者的尝试,太丑陋和复杂......在R中必须要容易得多!

mds*_*ner 6

你可以这样做:

meuse$zinc[1] <- NA 
Run Code Online (Sandbox Code Playgroud)

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

aname <- 'zinc'
meuse[[aname]][1] <- NA
Run Code Online (Sandbox Code Playgroud)

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

您可以期望这些可以正常工作,data.frame但它们不会:

meuse[1,'zinc'] <- NA
meuse[1,][['zinc']] <- NA
meuse[1,]$zinc <- NA 
Run Code Online (Sandbox Code Playgroud)

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


Jim*_* M. 5

对于Spatial*DataFrame对象,您可以使用"@data"访问data.frame插槽,并且通常的data.frame操作应该可以工作.用你的例子,

 meuse@data[1, 'zinc'] <- NA
Run Code Online (Sandbox Code Playgroud)

 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 ...
 ...
Run Code Online (Sandbox Code Playgroud)