使用 purrr::map 重新组织列表中 rasterstacks 中的图层
Use purrr::map to reorganize layers in rasterstacks inside the list
我需要重新排列列表中的一些 rasterStacks/rasterBricks,我想使用 purrr
来解决(学习并保持我的代码在那种风格中)。
我的输入列表的每个元素中都有 rasterBricks,每个 rasterBrick 有几层:
> clim_diff[1:5]
$access1_0.year2070.rcp85
class : RasterBrick
dimensions : 111, 78, 8658, 5 (nrow, ncol, ncell, nlayers)
resolution : 0.3333333, 0.3333333 (x, y)
extent : -82, -56, -24, 13 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs
data source : in memory
names : bio_1, bio_2, bio_4, bio_12, bio_13
min values : -26.07407, -29.01235, -465.18519, -1956.66667, -260.75926
max values : 31.00000, 16.38889, 484.37963, 821.46914, 181.79630
$bcc_csm1_1.year2070.rcp85
class : RasterBrick
dimensions : 111, 78, 8658, 5 (nrow, ncol, ncell, nlayers)
resolution : 0.3333333, 0.3333333 (x, y)
extent : -82, -56, -24, 13 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : in memory
names : bio_1, bio_2, bio_4, bio_12, bio_13
min values : -10.370370, -9.407407, -545.851852, -506.972222, -156.398148
max values : 4.046296, 5.901235, 169.981481, 1326.583333, 254.638889
(...)(more rasterBricks later)
我想使用 purrr
在 return 中获取一个新列表,其中第一个元素是一个 rasterBrick(或堆栈),所有层都命名为 bio_1
(第一层在每个 rasterBrick 中),第二个堆栈包含所有 bio_2
...
我需要它稍后用它们的值和 scale()
制作一个矩阵。所以,这样的事情适用于提到的一层:
clim_diff %>%
map(~ .x[["bio_1"]]) %>%
map_dfc(~ values(.x)) %>% t %>%
scale
有没有办法让 purrr
对我的所有变量都这样做?谢谢!!!
编辑 - clim_diff
可以使用此代码复制:
library(dismo)
clim_diff <- list()
clim_diff$access1_0.year2070.rcp85 <- getData('CMIP5', var = "bio", res = 10, rcp = 85, year = 70, model = "AC") %>%
setNames(paste0("bio_", 1:19)) %>%
subset(c("bio_1", "bio_2", "bio_4", "bio_12", "bio_13"))
clim_diff$bcc_csm1_1.year2070.rcp85 <- getData('CMIP5', var = "bio", res = 10, rcp = 85, year = 70, model = "BC") %>%
setNames(paste0("bio_", 1:19)) %>%
subset(c("bio_1", "bio_2", "bio_4", "bio_12", "bio_13"))
我会创建一个名为 arrange_ras
的函数,然后使用 purrr::map
将其应用于您的 bio_xxx
姓名列表
arrange_ras <- function(list, var){
res <- list %>%
map(~ .x[[var]]) %>%
map_dfc(~ values(.x)) %>% t %>%
scale
return(res)
}
# test for 2 names only to save time
var_list <- list("bio_1", "bio_2")
# main loop
res_all <- var_list %>%
purrr::set_names() %>%
map(~ arrange_ras(clim_diff, .x))
str(res_all, max.level = 1)
List of 2
$ bio_1: num [1:2, 1:1944000] NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "dimnames")=List of 2
..- attr(*, "scaled:center")= num [1:1944000] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
..- attr(*, "scaled:scale")= num [1:1944000] 0 0 0 0 0 0 0 0 0 0 ...
$ bio_2: num [1:2, 1:1944000] NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "dimnames")=List of 2
..- attr(*, "scaled:center")= num [1:1944000] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
..- attr(*, "scaled:scale")= num [1:1944000] 0 0 0 0 0 0 0 0 0 0 ...
我需要重新排列列表中的一些 rasterStacks/rasterBricks,我想使用 purrr
来解决(学习并保持我的代码在那种风格中)。
我的输入列表的每个元素中都有 rasterBricks,每个 rasterBrick 有几层:
> clim_diff[1:5]
$access1_0.year2070.rcp85
class : RasterBrick
dimensions : 111, 78, 8658, 5 (nrow, ncol, ncell, nlayers)
resolution : 0.3333333, 0.3333333 (x, y)
extent : -82, -56, -24, 13 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs
data source : in memory
names : bio_1, bio_2, bio_4, bio_12, bio_13
min values : -26.07407, -29.01235, -465.18519, -1956.66667, -260.75926
max values : 31.00000, 16.38889, 484.37963, 821.46914, 181.79630
$bcc_csm1_1.year2070.rcp85
class : RasterBrick
dimensions : 111, 78, 8658, 5 (nrow, ncol, ncell, nlayers)
resolution : 0.3333333, 0.3333333 (x, y)
extent : -82, -56, -24, 13 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : in memory
names : bio_1, bio_2, bio_4, bio_12, bio_13
min values : -10.370370, -9.407407, -545.851852, -506.972222, -156.398148
max values : 4.046296, 5.901235, 169.981481, 1326.583333, 254.638889
(...)(more rasterBricks later)
我想使用 purrr
在 return 中获取一个新列表,其中第一个元素是一个 rasterBrick(或堆栈),所有层都命名为 bio_1
(第一层在每个 rasterBrick 中),第二个堆栈包含所有 bio_2
...
我需要它稍后用它们的值和 scale()
制作一个矩阵。所以,这样的事情适用于提到的一层:
clim_diff %>%
map(~ .x[["bio_1"]]) %>%
map_dfc(~ values(.x)) %>% t %>%
scale
有没有办法让 purrr
对我的所有变量都这样做?谢谢!!!
编辑 - clim_diff
可以使用此代码复制:
library(dismo)
clim_diff <- list()
clim_diff$access1_0.year2070.rcp85 <- getData('CMIP5', var = "bio", res = 10, rcp = 85, year = 70, model = "AC") %>%
setNames(paste0("bio_", 1:19)) %>%
subset(c("bio_1", "bio_2", "bio_4", "bio_12", "bio_13"))
clim_diff$bcc_csm1_1.year2070.rcp85 <- getData('CMIP5', var = "bio", res = 10, rcp = 85, year = 70, model = "BC") %>%
setNames(paste0("bio_", 1:19)) %>%
subset(c("bio_1", "bio_2", "bio_4", "bio_12", "bio_13"))
我会创建一个名为 arrange_ras
的函数,然后使用 purrr::map
将其应用于您的 bio_xxx
姓名列表
arrange_ras <- function(list, var){
res <- list %>%
map(~ .x[[var]]) %>%
map_dfc(~ values(.x)) %>% t %>%
scale
return(res)
}
# test for 2 names only to save time
var_list <- list("bio_1", "bio_2")
# main loop
res_all <- var_list %>%
purrr::set_names() %>%
map(~ arrange_ras(clim_diff, .x))
str(res_all, max.level = 1)
List of 2
$ bio_1: num [1:2, 1:1944000] NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "dimnames")=List of 2
..- attr(*, "scaled:center")= num [1:1944000] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
..- attr(*, "scaled:scale")= num [1:1944000] 0 0 0 0 0 0 0 0 0 0 ...
$ bio_2: num [1:2, 1:1944000] NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "dimnames")=List of 2
..- attr(*, "scaled:center")= num [1:1944000] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
..- attr(*, "scaled:scale")= num [1:1944000] 0 0 0 0 0 0 0 0 0 0 ...