使用包含要选择的维度值的二维数组从 4 维 R 星数组中选择值

问题描述 投票:0回答:1

也许有人可以帮助我:

我有一个4维时空恒星数据集,其中包含年度值 四种不同树种的变量:

# 4-dimensional stars data: x,y,time, species
dat <- st_as_stars(array(data = runif(2000), dim = c(10, 10, 5, 4))) |> 
  setNames("data_val") |>
  st_set_dimensions(names= c("x","y", "year", "tree_species")) |>
  st_set_dimensions("year", values = 2018:2022) |>
  st_set_dimensions("tree_species",values = c("bu", "fi", "ki", "ei"))
plot(dat)  # (only values of the first slice of tree_speciess ("bu") displayed)

作为第二个对象,我有一个物种身份图,其中包含有关 哪个像素属于哪个物种:

# 2-d species map (x,y)
species_map <- st_as_stars(matrix(sample(c("bu", "fi", "ki", "ei"),size = 100, replace = TRUE), 
                                  ncol = 10, byrow=T)) |> 
  setNames("tree_species") |> 
  st_set_dimensions(c(1,2), names= c("x","y"))
species_map$tree_species <- factor(species_map$tree_species)
plot(species_map, col = c("#fdc086","#ffff99","#7fc97f","#beaed4"))

基于此species_map,我想从匹配

tree_species
的数据中逐像素(x/y)提取时间序列。生成的星星对象将是一个 3 维数组(因为第四个数据维度 (tree_species) 已折叠),(x,y,year) 中的数据值来自相应的物种条目。因此,在生成的星体数组(物种 ei,ki,ei,bu)的左上角,将包含来自 4 维索引 (4,3,4,1) 的数据值。

到目前为止我的所有尝试都失败了......我尝试使用

ifelse()
,这导致了正确的维度,但是它没有获得正确的结果。我也尝试过匹配值,但这也失败了:

dat$data_val[, , , species_map$tree_species]

我想我的问题可以通过一些基本的 R 命令轻松解决。

谢谢您的帮助。

祝一切顺利 保罗

r arrays multidimensional-array r-stars
1个回答
0
投票

也许有一种更简单的方法,但你可以通过循环来实现:

res <- array(0, dim = c(10, 10, 5))

for(i in seq(dim(dat)[1])) {
  for(j in seq(dim(dat)[2])) {
    spe <- species_map$tree_species[i,j]
    spe <- match(spe, attributes(dat)$dimensions$tree_species$values)
    res[i,j,] <- dat$data_val[i,j,,spe]
  }
}

st_as_stars(res) |> 
  setNames("data_val") |>
  st_set_dimensions(names= c("x","y", "year")) |>
  st_set_dimensions("year", values = 2018:2022)
#> stars object with 3 dimensions and 1 attribute
#> attribute(s):
#>                   Min.   1st Qu.    Median      Mean   3rd Qu.      Max.
#> data_val  0.0006052661 0.2296937 0.4519045 0.4826458 0.7461618 0.9963633
#> dimension(s):
#>      from to offset delta point x/y
#> x       1 10      0     1 FALSE [x]
#> y       1 10      0     1 FALSE [y]
#> year    1  5   2018     1 FALSE  
© www.soinside.com 2019 - 2024. All rights reserved.