将列表中的所有SpatialPolygonsDataFrame对象聚合成一个SpatialPolygonsDataFrame

3

我只是想把所有多边形聚合成一个类型为SpatialPolygonsDataFrame的sp对象,而不是编辑拓扑。每个spdf中只有一个多边形。

数据(Dropbox链接到数据)(文件大小1.1KB)(在这种情况下,dput()不适用):

list_of_spdf <- unlist(readRDS("data.Rds"))

我用以下方法获得所需的结果:

one_spdf <- rbind(list_of_spdf[1][[1]], list_of_spdf[2][[1]], list_of_spdf[3][[1]], makeUniqueIDs = TRUE)

# when plotting can see two polygons (third object is a repeat for sake of testing)
plot(one_spdf)

我有成百上千个对象(虽然每个spdf只有一个多边形),我需要通过程序化的方式进行。因此我尝试使用

list_of_spdf <- lapply(list_of_spdf, rbind, makeUniqueIDs = TRUE)

显然,这会返回一个列表,不是我想要的结果。 因此,我编写了一个函数:
rbindSPDF <- function(lst) {
# Create empty spdf objects  
pol <-
    SpatialPolygonsDataFrame(SpatialPolygons(list()), data = data.frame())
  pols <-
    SpatialPolygonsDataFrame(SpatialPolygons(list()), data = data.frame())
# loop for rbind
  for (i in 1:length(lst)) {
    pol[i] <- lst[i][[1]]
    if (length(pols) == 0) {
      pols <- pol[i]
    } else {
      pols <- rbind(pols, pol[i], makeUniqueIDs = TRUE)
    }
  }
  return(pols)
}

但是,当使用rbindSPDF时:

single_spdf <- rbindSPDF(list_of_spdf)

I get:

Error in as.vector(data) : 
 no method for coercing this S4 class to a vector

不确定我在这里做错了什么。

另外,我猜我可能甚至不需要使用自己的函数。

注意:除了许多其他软件包外,我正在使用sprgdal处理空间数据,由于附加/分离时间和屏蔽问题,我宁愿避免使用另一个软件包。

1个回答

4
拥有一个编程版本的。
one_spdf <- rbind(list_of_spdf[1][[1]], 
                  list_of_spdf[2][[1]], 
                  list_of_spdf[3][[1]], 
                  ...
                  makeUniqueIDs = TRUE)

对于非常长的 list_of_spdf 列表,下面这样的方法是否可行?

# generate list containing list_of_spdf[i][[1]]
list.df <- lapply(seq_along(list_of_spdf),
                  function(i){list_of_spdf[i][[1]]})

# apply rbind to the list
one_spdf2 <- do.call("rbind",
                     c(args = list.df, makeUniqueIDs = TRUE))

> all.equal(one_spdf, one_spdf2)
[1] TRUE

我的机器上的结果似乎是相等的。

谢谢@Z.Lin。如果我能在do.call()中添加makeUniqueIDs = TRUE,那么它可能有效。我该怎么做呢? - jpinelo
嗯,do.call("rbind", args = c(list.df, makeUniqueIDs = TRUE)) 对你有用吗? - Z.Lin
明白了,谢谢:one_spdf <- do.call("rbind", c(args = list.df, makeUniqueIDs = TRUE)) - jpinelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接