将列表中的所有 SpatialPolygonsDataFrame 对象聚合到一个 SpatialPolygonsDataFrame
Aggregating all SpatialPolygonsDataFrame objects from list into one SpatialPolygonsDataFrame
不打算编辑拓扑,只是将所有多边形聚合到一个 sp
类型 SpatialPolygonsDataFrame
(spdf) 的对象中。每个 spdf 只有一个多边形。
数据(dropbox link to data)(文件大小 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 只有一个多边形),我需要以编程方式执行 rbind
。所以我尝试了 lapply
list_of_spdf <- lapply(list_of_spdf, rbind, makeUniqueIDs = TRUE)
显然,这个 returns 是一个列表,因此不是我要找的。
所以我写了一个函数:
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)
我得到:
Error in as.vector(data) :
no method for coercing this S4 class to a vector
不确定我做错了什么。
另外,我猜我可能甚至不需要使用我自己的函数。
注意:在许多其他包之上,我使用 sp
和 rgdal
空间数据,并且由于 attaching/detaching 时间和掩蔽,我宁愿避免使用另一个包.
拥有程序化版本
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
结果在我的机器上似乎是相同的。
不打算编辑拓扑,只是将所有多边形聚合到一个 sp
类型 SpatialPolygonsDataFrame
(spdf) 的对象中。每个 spdf 只有一个多边形。
数据(dropbox link to data)(文件大小 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 只有一个多边形),我需要以编程方式执行 rbind
。所以我尝试了 lapply
list_of_spdf <- lapply(list_of_spdf, rbind, makeUniqueIDs = TRUE)
显然,这个 returns 是一个列表,因此不是我要找的。
所以我写了一个函数:
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)
我得到:
Error in as.vector(data) :
no method for coercing this S4 class to a vector
不确定我做错了什么。
另外,我猜我可能甚至不需要使用我自己的函数。
注意:在许多其他包之上,我使用 sp
和 rgdal
空间数据,并且由于 attaching/detaching 时间和掩蔽,我宁愿避免使用另一个包.
拥有程序化版本
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
结果在我的机器上似乎是相同的。