也许有人可以帮助我:
我有一个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 命令轻松解决。
谢谢您的帮助。
祝一切顺利 保罗
也许有一种更简单的方法,但你可以通过循环来实现:
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