【问题标题】:Conditionally extract data from a raster stack data based on values in a spatial points dataframe根据空间点数据框中的值有条件地从栅格堆栈数据中提取数据
【发布时间】:2016-08-11 20:58:37
【问题描述】:

我有一个包含 84 个图层的栅格堆栈,每个图层对应于 1999 年 11 月至 2006 年 10 月的 1 个月降雨量。我已将栅格堆栈中的图层命名为 199911 至 200610,即年份和月份。我还有一个空间点数据框,其中每一行都有相同格式的日期。

我想从栅格堆栈中提取某行日期与该行空间位置上一个 10 月之间的所有降雨量的总和。因此,如果某一行的日期是 20006 年(2000 年 6 月),它将汇总该行位置在 199910 年(1999 年 10 月)和 20006 年之间的所有降雨量。由于我有很多数据,我想自动化这个过程。

我试图让它工作,但没有快乐。有人有什么建议吗?

【问题讨论】:

    标签: r spatial raster r-raster


    【解决方案1】:

    这是一种选择:

    library(raster)
    
    # Vector of dates
    dates <- format(seq(as.Date('1999/1/11'), as.Date('2006/1/10'), by='month'), '%Y%m')
    
    # RasterStack with random data
    s <- setNames(stack(replicate(length(dates), raster(matrix(runif(100), 10)))), 
                  paste0('rain', dates))
    
    # Create a SpatialPointsDataFrame with some random dates and coords
    d <- data.frame(x=runif(10), y=runif(10), date=sample(dates, 10))
    coordinates(d) <- ~x+y
    
    # Split the spdf by date
    d_by_date <- split(d, d$date)
    
    # Extract values
    rain_sum <- unsplit(lapply(d_by_date, function(x) {
      # current year
      y <- as.numeric(substr(x$date, 1, 4))
      # current month
      m <- as.numeric(substr(x$date, 5, 6))
      # if month is after Oct, start from that year's Oct
      # if month is before Oct, start from previous year's Oct
      if(m < 11) y <- y-1
      start_date <- as.Date(sprintf('%s/10/01', y))
      # if start_date is earlier than first time slice, reset to first time slice
      start_date <- max(min(as.Date(sub('rain', '01', names(s)), '%d%Y%m')), start_date)
      end_date <- as.Date(paste0(x$date, '01'), '%Y%m%d')
      # Sequence of dates to sum over
      i <- format(seq(start_date, end_date, by='month'), 'rain%Y%m')
      # Extract values and sum
      sum(extract(s[[i]], x))
    }), d$date)
    

    【讨论】:

    • 感谢 jbaums 的帮助!不幸的是,我无法让代码为我工作,我不断收到警告和错误。我认为“if”语句只会检查第一个条目,所以我会尝试编写一个 for 循环,看看是否有帮助。警告消息:在 if (m 1 并且只会使用第一个元素 格式错误(seq(start_date, end_date, by = "month"), "rain %Y%m") : 在为函数 'format' 选择方法时评估参数 'x' 时出错: seq.Date(start_date, end_date, by = "month") 中的错误: 'to' 的长度必须为 1
    • 我有代码可以为我工作,并编辑了您的答案以反映我所做的更改。最值得注意的是,我将您的 lapply 换成了 for 循环。已接受您的回答。
    • 除非出于某种原因我的编辑没有被接受...去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2014-04-15
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多