【问题标题】:Preserve/store through raster loop in R通过 R 中的光栅循环保存/存储
【发布时间】:2019-06-23 11:13:00
【问题描述】:

我有一个大的栅格堆栈,我计算每两层的最大值。以下循环除了 日期。如何将日期保存到我的新堆栈中? (我假设我需要getZ,但我不知道如何实现它。)

谢谢

示例代码

m_date<-as.data.frame(as.Date(c('2009-05-01','2010-03-25','2007-06-14','2008-12-18','2016-05-20')))

m_r <- raster(matrix(1:60,3,4))
m_stack <- stack(m_r,m_r,m_r,m_r,m_r)
m_stack <- addLayer(m_stack,m_date)

new_stack<-m_stack[[1]]
new_stackk@z$Date<-m_stack@z$Date[[1]]


for (i in 1:5) {
    # calculate max every two layers (works fine)
    new_stack[[k]] <- calc(m_stack[[((i-1)*2 + 1):((i-1)*2 + 2)]], fun = max, na.rm = T)
    # store the date for each one of the max layers (does not work)
    new_stack@z$Date[[i]] <-m_stack@z$Date[[i]]

}

【问题讨论】:

    标签: r loops date raster


    【解决方案1】:

    这是一些运行的代码。它假设:

    1. 您希望比较相邻的日期(图层按日期排序)
    library(raster)
    
    m_date <- data.frame(date = 
      as.Date(c('2009-05-01','2010-03-25','2007-06-14','2008-12-18')))
    
    m_r       <- lapply(m_date$date, function(x) raster(matrix(rnorm(60),3,4)))
    m_stack   <- stack(m_r)
    m_stack@z <- list(m_date = m_date[,1])
    
    # sort by date
    m_stack   <- m_stack[[order(m_stack@z$m_date)]]
    
    new_stack <- m_stack[[-1]]
    
    for (i in 1:(nlayers(new_stack))) {
      new_stack[[i]] <- calc(m_stack[[i:(i+1)]], fun = max)
    
      new_stack@z$m_date[[i]] <- m_stack@z$m_date[i:(i+1)][
        which.max(c(
          cellStats(m_stack[[i]], stat = max), 
          cellStats(m_stack[[i+1]], stat = max)))]
    }
    
    new stack
    
    dimensions  : 3, 4, 12, 3  (nrow, ncol, ncell, nlayers)
    resolution  : 0.25, 0.3333333  (x, y)
    extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
    coord. ref. : NA 
    names       :     layer.1,     layer.2,     layer.3 
    min values  : -0.03990727, -0.46295595, -0.39121706 
    max values  :    2.261900,    2.261900,    1.647811 
    m_date      : 2008-12-18, 2008-12-18, 2009-05-01 
    
    
    

    【讨论】:

    • 感谢您的回复。我实际上做了一个滚动最大值,但计算平均日期不是我想要的。每次滚动我都会得到最大光栅层,我想要的是保持它的日期。
    • 再次感谢您。不过我有点困惑,我认为您使用的索引是错误的。我的滚动方法,计算 2 对的最大值(例如,第 1 层和第 2 层的最大值,第 3 层和第 4 层的最大值,第 5 层和第 6 层的最大值)。在您的示例中,我认为您使用了不同的滚动窗口(例如,第 1 层和第 2 层的最大值,第 2 层和第 3 层的最大值)。我错了吗?
    • 你现在描述的不是滚动方式。
    • 我更改了它,因为您要求滚动最大值 1,2; 2,3。我更改了层数,因为它不可能对奇数层进行非滚动计算。
    • 我明白了,我的错误更像是一个移动的窗口而不是滚动。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2017-07-20
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多