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中必须要容易得多!
你可以这样做:
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"了解基础知识.
对于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)
| 归档时间: |
|
| 查看次数: |
2234 次 |
| 最近记录: |