apply family 中的两个列表
Two lists in apply family
我正在尝试使用 apply
从栅格列表 (rasterlist
) 中提取两个区域 ex1
和 ex2
(在 exlist
中) family 和 extract
来自光栅包。我可以使用嵌套的 for 循环,但想知道是否有一种方法可以通过其中一个 apply 系列成员实现这一点,因为嵌套的 for 循环被认为是 more or less bad practice in R。这里是虚拟代码:
library(raster)
ras1 <- raster(matrix(runif(20), nrow = 5, ncol = 5))
ras2 <- ras1 * 2
ras3 <- ras1 * 0.5
rasterlist <- list(ras1, ras2, ras3)
ex1 <- extent(0, 0.4, 0, 0.4)
ex2 <- extent(0.6, 1, 0.4, 1)
exlist <- list(ex1, ex2)
目前我将其作为(相当不满意的)解决方案:
out1 <- lapply(rasterlist, function(i) extract(i, ex1))
out2 <- lapply(rasterlist, function(i) extract(i, ex2))
N.B。它做的解决方案不需要 apply家族的一员(虽然那是我给自己定的任务)如果有更好、更快、更优雅的方式请分享。
您可以先将这些区域组合成一个 SpatialPolygons 对象(也许它们是开始的?)。使用您的示例数据可以这样做:
ex <- do.call(bind, sapply(exlist, function(x) as(x, 'SpatialPolygons')))
在这个例子中(使用可以堆叠的 RasterLayer 对象)你可以做
s <- stack(rasterlist)
extract(s, ex)
我正在尝试使用 apply
从栅格列表 (rasterlist
) 中提取两个区域 ex1
和 ex2
(在 exlist
中) family 和 extract
来自光栅包。我可以使用嵌套的 for 循环,但想知道是否有一种方法可以通过其中一个 apply 系列成员实现这一点,因为嵌套的 for 循环被认为是 more or less bad practice in R。这里是虚拟代码:
library(raster)
ras1 <- raster(matrix(runif(20), nrow = 5, ncol = 5))
ras2 <- ras1 * 2
ras3 <- ras1 * 0.5
rasterlist <- list(ras1, ras2, ras3)
ex1 <- extent(0, 0.4, 0, 0.4)
ex2 <- extent(0.6, 1, 0.4, 1)
exlist <- list(ex1, ex2)
目前我将其作为(相当不满意的)解决方案:
out1 <- lapply(rasterlist, function(i) extract(i, ex1))
out2 <- lapply(rasterlist, function(i) extract(i, ex2))
N.B。它做的解决方案不需要 apply家族的一员(虽然那是我给自己定的任务)如果有更好、更快、更优雅的方式请分享。
您可以先将这些区域组合成一个 SpatialPolygons 对象(也许它们是开始的?)。使用您的示例数据可以这样做:
ex <- do.call(bind, sapply(exlist, function(x) as(x, 'SpatialPolygons')))
在这个例子中(使用可以堆叠的 RasterLayer 对象)你可以做
s <- stack(rasterlist)
extract(s, ex)