gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:02:26 24 4
gpt4 key购买 nike

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

最佳答案

你可以这样做:

meuse$zinc[1] <- NA 

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

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

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

您可能期望这些会像普通的 data.frame 一样工作,但它们不会:

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

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

关于r - 轻松分配和使用 Spatial*DataFrame 的数据值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com