尝试通过mapply或类似的东西完成它而不进行迭代 - 我在R中有一个空间数据框,并希望对所有更复杂的形状进行子集化 - 即具有10个或更多坐标的形状。 shapefile是实质性的(10k形状),对于小样本来说很好的方法对于大样本来说非常慢。迭代方法是
Street$cc <-0
i <- 1
while(i <= nrow(Street)){
Street$cc[i] <-length(coordinates(Street)[[i]][[1]])/2
i<-i+1
}
如何以任何阵列方式获得相同的效果?从顶部(Shapefile / lines / Lines / coords)访问几个级别我有一个问题
我试过了:
Street$cc <- lapply(slot(Street, "lines"),
function(x) lapply(slot(x, "Lines"),
function(y) length(slot(y, "coords"))/2))
/除以2,因为每个坐标是一对2个值/ 但仍然会返回一个列表,其中包含每行的项目数,而不是整数,告诉我有多少项目。如何获得空间数据框中每个形状的坐标数?抱歉,我没有可重复的示例,但您可以检查任何空间文件 - 它更多的是访问低级别的属性而不是非常具体的问题。
编辑: 我解决了这个问题 - 使用函数
tail()
答案 0 :(得分:1)
这是一个可重复的例子。与你的略有不同,因为你没有提供数据,但原理是一样的。 &#39;原则&#39;深入研究复杂的S4结构时,要注意每个级别是列表还是插槽,使用[[]]
访问列表,@
用于插槽。
首先让我们得到一个空间ploygon。我将使用美国州界;
library(maps)
local.map = map(database = "state", fill = TRUE, plot = FALSE)
IDs = sapply(strsplit(local.map$names, ":"), function(x) x[1])
states = map2SpatialPolygons(map = local.map, ID = IDs)
现在我们可以使用少于200个顶点对多边形进行子集化,如下所示:
# Note: next line assumes that only interested in one Polygon per top level polygon.
# I.e. assumes that we have only single part polygons
# If you need to extend this to work with multipart polygons, it will be
# necessary to also loop over values of lower level Polygons
lengths = sapply(1:length(states), function(i)
NROW(states@polygons[[i]]@Polygons[[1]]@coords))
simple.states = states[which(lengths < 200)]
plot(simple.states)