在 R 中使用方括号的空间逆子集
Spatial inverse subset using square brackets in R
我有一个空间点数据框 -> spatial_points
和一个多边形 -> spatial_poly
我可以使用
对多边形内的所有点进行子集化
subset_within <- spatial_points[spatial_poly,] which is nice and intuitive.
但是如果我想对多边形之外的所有点进行子集化,我不能使用
subset_ouside <- spatial_points[-spatial_poly,]
这个问题之前有人问过,答案是使用rgeos
包中的gDifference()
。很好。
我的问题是,为什么 [ ] 对内部选择起作用,而不是相反?我不太明白错误信息
Error in h(simpleError(msg, call)) : error in evaluating the
argument 'i' in selecting a method for function '[': invalid argument
to unary operator
只是好奇。谢谢。
编辑
这里是从Subset spatial points with a polygon
借来的例子
require(rgeos)
require(sp)
##create spdf
coords=expand.grid(seq(150,151,0.1),seq(-31,-30,0.1))
spdf=data.frame("lng"=coords[,1],"lat"=coords[,2])
coordinates(spdf) = ~lng+lat
proj4string(spdf)<- CRS("+init=epsg:4326")
plot(spdf)
##create poly
poly1 = SpatialPolygons(list(Polygons(list(Polygon(cbind(c(150.45,150.45,150.75,150.75,150.45),c(-30.75,-30.45,-30.45,-30.75,-30.75)))),ID=1)))
proj4string(poly1)<- CRS("+init=epsg:4326")
##get points withing polygon
points_within <-spdf[poly1,] # this works
plot(spdf)
plot(poly1, add=T)
plot(points_within,col="blue",pch=16,add=T)
##get points outside polygon
points_outside <-spdf[-poly1,] # this does not work - why??
在这个简单的例子中,可以使用 gDifference()
,它在这个例子中有效。但是,我的 SpatialPointDataframe 非常大,使用 gDifference 会使 R 崩溃。
当你在 R 中执行 df[2, 1]
时,你实际上是在调用一个函数。函数是'['(df, 1, 2)
。只是解析器向您隐藏了这一点,这使您可以以更自然的方式编写代码。
如果您考虑一下,[
运算符会根据您使用的对象类型执行不同的操作,即使这些操作在概念上是相似的。 return 是数值向量子集的实际代码不同于 return 是矩阵或列表子集的代码。事实上,R 中有一些对象调用 [
函数没有意义,也没有实现。例如,如果您尝试在函数名称上调用它:
print[1]
#> Error in print[1] : object of type 'closure' is not subsettable
如果您在 R 中使用各种不同的成员创建一个复杂的 new class,则需要定义 [
运算符的含义,并且需要实现它。用 SpatialPolygon
class 对 SpatialPoints
class 进行子集化是什么意思? R 本身无法知道这一点,因此当 sp
包的作者创建 SpatialPolygons
class 时,他必须编写基于操作数进行子集化的方法传递给运算符 [
。可以看源码here.
顺着逻辑往下看,在spdf[poly1,]
的情况下,子集是由其他空间函数决定的,归结为
which(!is.na(over(spdf, geometry(poly1))))
#> 39 40 41 50 51 52 61 62 63
#> 39 40 41 50 51 52 61 62 63
然后使用这些数字子集将实际多边形子集化为 return 仅由子集组成的新对象。这意味着我们可以用类似的方式得到 points_outside
:
points_within <- spdf[poly1,]
points_outside <- spdf[which(is.na(over(spdf, geometry(poly1))))]
plot(spdf)
plot(poly1, add = TRUE)
plot(points_within, col="blue", pch = 16, add = TRUE)
plot(points_outside, col="red", pch = 16, add = TRUE)
但是要回答您的主要问题,即为什么 spdf[-poly1,]
不起作用,您必须意识到这实际上意味着 '['(spdf, -poly1)
。要对此进行评估,首先需要评估 -poly1
,但如果您尝试这样做,则会得到:
-poly1
#> Error in -poly1 : invalid argument to unary operator
当然,将 -
运算符单独应用于 SpatialPoints
对象并没有实际意义。从what?
中拿分
事实上,可以编写函数使其以这种方式工作,但需要进行一些复杂的 non-standard 评估。您可以在该 GitHub 页面上将其作为功能请求提交,但我个人很乐意使用上述功能。
我希望这能让事情变得更清楚。
我有一个空间点数据框 -> spatial_points
和一个多边形 -> spatial_poly
我可以使用
对多边形内的所有点进行子集化subset_within <- spatial_points[spatial_poly,] which is nice and intuitive.
但是如果我想对多边形之外的所有点进行子集化,我不能使用
subset_ouside <- spatial_points[-spatial_poly,]
这个问题之前有人问过,答案是使用rgeos
包中的gDifference()
。很好。
我的问题是,为什么 [ ] 对内部选择起作用,而不是相反?我不太明白错误信息
Error in h(simpleError(msg, call)) : error in evaluating the argument 'i' in selecting a method for function '[': invalid argument to unary operator
只是好奇。谢谢。
编辑
这里是从Subset spatial points with a polygon
借来的例子require(rgeos)
require(sp)
##create spdf
coords=expand.grid(seq(150,151,0.1),seq(-31,-30,0.1))
spdf=data.frame("lng"=coords[,1],"lat"=coords[,2])
coordinates(spdf) = ~lng+lat
proj4string(spdf)<- CRS("+init=epsg:4326")
plot(spdf)
##create poly
poly1 = SpatialPolygons(list(Polygons(list(Polygon(cbind(c(150.45,150.45,150.75,150.75,150.45),c(-30.75,-30.45,-30.45,-30.75,-30.75)))),ID=1)))
proj4string(poly1)<- CRS("+init=epsg:4326")
##get points withing polygon
points_within <-spdf[poly1,] # this works
plot(spdf)
plot(poly1, add=T)
plot(points_within,col="blue",pch=16,add=T)
##get points outside polygon
points_outside <-spdf[-poly1,] # this does not work - why??
在这个简单的例子中,可以使用 gDifference()
,它在这个例子中有效。但是,我的 SpatialPointDataframe 非常大,使用 gDifference 会使 R 崩溃。
当你在 R 中执行 df[2, 1]
时,你实际上是在调用一个函数。函数是'['(df, 1, 2)
。只是解析器向您隐藏了这一点,这使您可以以更自然的方式编写代码。
如果您考虑一下,[
运算符会根据您使用的对象类型执行不同的操作,即使这些操作在概念上是相似的。 return 是数值向量子集的实际代码不同于 return 是矩阵或列表子集的代码。事实上,R 中有一些对象调用 [
函数没有意义,也没有实现。例如,如果您尝试在函数名称上调用它:
print[1]
#> Error in print[1] : object of type 'closure' is not subsettable
如果您在 R 中使用各种不同的成员创建一个复杂的 new class,则需要定义 [
运算符的含义,并且需要实现它。用 SpatialPolygon
class 对 SpatialPoints
class 进行子集化是什么意思? R 本身无法知道这一点,因此当 sp
包的作者创建 SpatialPolygons
class 时,他必须编写基于操作数进行子集化的方法传递给运算符 [
。可以看源码here.
顺着逻辑往下看,在spdf[poly1,]
的情况下,子集是由其他空间函数决定的,归结为
which(!is.na(over(spdf, geometry(poly1))))
#> 39 40 41 50 51 52 61 62 63
#> 39 40 41 50 51 52 61 62 63
然后使用这些数字子集将实际多边形子集化为 return 仅由子集组成的新对象。这意味着我们可以用类似的方式得到 points_outside
:
points_within <- spdf[poly1,]
points_outside <- spdf[which(is.na(over(spdf, geometry(poly1))))]
plot(spdf)
plot(poly1, add = TRUE)
plot(points_within, col="blue", pch = 16, add = TRUE)
plot(points_outside, col="red", pch = 16, add = TRUE)
但是要回答您的主要问题,即为什么 spdf[-poly1,]
不起作用,您必须意识到这实际上意味着 '['(spdf, -poly1)
。要对此进行评估,首先需要评估 -poly1
,但如果您尝试这样做,则会得到:
-poly1
#> Error in -poly1 : invalid argument to unary operator
当然,将 -
运算符单独应用于 SpatialPoints
对象并没有实际意义。从what?
事实上,可以编写函数使其以这种方式工作,但需要进行一些复杂的 non-standard 评估。您可以在该 GitHub 页面上将其作为功能请求提交,但我个人很乐意使用上述功能。
我希望这能让事情变得更清楚。