解决空间对象的子集设置不起作用的原因

Troubleshooting why subsetting of spatial object does not work

我正在尝试在 R 中对 'SpatialPolygonsDataFrame' 进行子集化,但其他线程中提出的方法似乎不起作用。我正在使用 R 版本 3.3.2,我正在 mac 上通过 R studio 访问它。

不幸的是,我无法提供我的数据集,(因为我无法对我的数据进行子集化)。

这个,

sp2 <- sp1[sp1@data$compound_found == 1, ]

产生了以下错误:

Error in sp1[sp1@data$compound_found == 1, ] :    cannot get a slot ("Polygons") from an object of type "NULL"

尽管

sp1@data$compound_found == 1

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE 
[14] FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
FALSE FALSE  TRUE  TRUE 
[27]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
TRUE FALSE FALSE FALSE  TRUE

sp2 <- sp1["compound_found" == 1, ]

不会创建错误,但会创建一个空对象

nrow(sp2@data) # returns 0

任何解释为什么我不能按照我尝试的方式进行子集化?我该怎么做呢?

编辑:

class(sp1)

returns

[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

编辑以描述在 OP 的帮助下找到解决方案的故障排除。

A SpatialPolygonsDataFrame 通常可以像 OP 在原始问题中所做的那样进行子集化:

sp1[sp1@data$compound_found == 1, ]

在没有看到数据的情况下不确定错误来自何处。要进行故障排除,您可以检查 SpatialPolygonsDataFrame 的结构以查看错误可能来自何处。

str(sp1) 

您还可以分别对 @data@polygons 进行子集化,以检查它是否提取了正确的元素。

如果你想子集 sp1@data 你可以使用:

sp1@data[1:ncol(sp1@data)][sp1@data$compound_found == 1,]

得到sp1@polygons:

sp1@polygons[sp1@data$compound_found == 1]

注意@data@polygons的长度应该是一样的。参见 http://www.dpi.inpe.br/gilberto/tutorials/software/R-contrib/sp/html/SpatialPolygons.html

"data: the number of rows in data should equal the number of Polygons-class objects in Sr"

检查 nrow(sp1@data)length(sp1@polygons) 是否相同。