我们有一个栅格代表与生长季节开始相对应的序数日期。也就是说,栅格中的每个像素值都在1:365之间,代表序数日期。
我还计算了相应年份所有365天的累积增长度日数。这些数据作为具有365层的光栅堆栈加载到R中。
我的目标是在生长季节层开始时随机抽取地理位置。然后,我希望从相同的坐标中提取累积增长度数天的值,但仅从增长度天数堆栈的层中提取,该层对应于季节像素值的开始。
例如,如果给定像素的季节开始是一年中的第100天,我想从一年的第100天(nlayers = 100)中提取该位置的增长度数天数。
我一直在尝试编写一个功能来实现这一目标,但我似乎无法让它正常工作。我想最终得到一个数据框或矩阵,显示我的x位置,y位置,季节开始日和当天的GDD。我在一列中没有多个GDD值,而是获得了一个GDD值的多列。
似乎问题在于我使用的提取物。我已经尝试了参数nl,layer,并使用[[]]索引x参数。它们似乎产生了相同的结果。这是一个只需要5天时间考虑的简化代码,以及我正在尝试构建的函数。
感谢任何帮助/建议!
#============================================================
library(raster)
SOST <- raster()
SOST[] <- 1:5
r1 <- r2 <- r3 <- r4 <- r5 <- raster()
r1[] <- 10
r2[] <- 20
r3[] <- 30
r4[] <- 40
r5[] <- 50
GDD <- stack(r1,r2,r3,r4,r5)
getGDD <- function(sost, gdd, n){set.seed(232)
samp <- sampleRandom(sost, n, xy = TRUE,
na.rm = TRUE)
df <- data.frame('x'=as.numeric(), 'y'=
as.numeric(), 'SOST'=as.numeric(),
'GDD'=as.numeric())
df.temp <- data.frame('x' = samp[1:n,1], 'y' =
samp[1:n,2], 'SOST' = samp[,3],'GDD' =
extract(gdd, samp[1:n,1:2], nl = samp[1:n,3]))
df <- rbind(df, df.temp)
return(df)
}
getGDD(sost = SOST, gdd = GDD, n = 5)
答案 0 :(得分:2)
这似乎并没有引起很多关注,但我能够解决它。使用原始问题中发布的示例,最简单的解决方案是stackSelect
函数。 Robert Hijmans在R-sig-geo上向我指出了这一点。
x <- stackSelect(GDD, SOST)
set.seed(232)
samp <- sampleRandom(SOST, 5, xy = TRUE, na.rm = TRUE)[, -3]
extract(x, samp)
如果您的数据具有相同的范围和分辨率,则效果很好。但是,我没有提及并包含我的数据不完全对齐。因此,据我所知,我仍然需要创建一个函数。经过一番思考,我能够提出以下示例和功能并解决问题。
library(raster)
#SOST and GDD simulations with same ncell and extents as actual data:
SOST <- raster(nrow = 3991, ncol = 3025, xmn = 688635, xmx = 779385,
ymn = 4276125, ymx = 4395855, crs = "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0")
SOST[] <- 1:5
r1 <- r2 <- r3 <- r4 <- r5 <- raster(nrow = 3951, ncol = 2995, xmn = 688620.2, xmx = 779377.8, ymn = 4276121, ymx = 4395848, crs = "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0")
r1[] <- 10
r2[] <- 20
r3[] <- 30
r4[] <- 40
r5[] <- 50
GDD <- stack(r1,r2,r3,r4,r5)
getGDD <- function(sost, gdd, n){
set.seed(232)
samp <- sampleRandom(sost, size = n, xy = TRUE)
extr <- NULL
for(i in 1:n){
extr[i] <- extract(gdd[[samp[i,3]]], cbind(as.matrix(samp[i,1]),
as.matrix(samp[i,2])))
}
out <- data.frame(x = samp[,1], y = samp[,2], 'SOST' = samp[,3], 'GDD' = extr)
return(out)
}
test <- getGDD(sost = SOST, gdd = GDD, n = 5)
test