【问题标题】:R Raster - Create layer with conditionals looping through multiple layersR Raster - 创建具有循环多个图层的条件的图层
【发布时间】:2017-12-12 08:26:02
【问题描述】:

我正在使用时间序列光栅砖。砖有 365 层,代表一年中每一天的值。

我想创建一个新层,其中每个单元格保存满足特定条件的一年中的天数。

我目前的方法如下(APHRO 是光栅砖),但返回以下错误消息:

enter code here
r <- raster(ncol=40, nrow=20)
r[] <- rnorm(n=ncell(r))
APHRO <- brick(x=c(r, r*2, r))    
NewLayer <- calc(APHRO, fun=FindOnsetDate(APHRO))

返回此错误:

 Error in .local(x, ...) : not a valid subset 

以及被解析的函数:

FindOnsetDate <- function (s) {
  x=0  
  repeat {
    x+1
    if(s[[x]] >= 20 | s[[x]] + s[[x+1]] >= 20 & ChkFalseOnset() == FALSE)
    {break}
  }
  return(x);
}

第三个条件的函数是:

ChkFalseOnset <- function (x) {



  for (i in 0:13){

    if (sum(APHRO[[x+i:x+i+7]]) >= 5)
    {return(FALSE); break}
    return(TRUE)  
  }
}

提前谢谢你!!!!

如果我应该提供更多信息,请告诉我 - 尽量保持简洁。

【问题讨论】:

  • 能否提供reproducible example
  • @Emmanuel-Lin 我现在创建了一个示例砖供您检查。提前谢谢!

标签: r loops layer raster


【解决方案1】:

问题是你的功能不行:

FindOnsetDate <- function (s) {
   x=0  
   repeat {
     x+1
     if(s[[x]] >= 20 | s[[x]] + s[[x+1]] >= 20)
     {break}
   }
   return(x);
 }
 FindOnsetDate(1:100)
 #Error in s[[x]] : 
 # attempt to select less than one element in get1index <real>

大概是这样的:

FindOnsetDate <- function (s) {
   j <- s + c(s[-1], 0)
   sum(j > 20 | s > 20)
   # if all values are positive, just do sum(j > 20)
}
FindOnsetDate(1:20)
#10

现在可以使用了:

 r <- calc(APHRO, FindOnsetDate)

【讨论】:

  • 亲爱的 RobertH,@aldo_tapia,感谢您的帮助。如果您能详细说明一下您的解决方案,那就太好了。我不能让它解决我的具体问题——我是 R 的新手,我的脑袋围绕着它。更多背景信息:该数据集包含亚洲地区一年的每日降水数据。我试图确定定义如下的季风发作:连续 2 天的第一天降雨量超过 20 毫米,并且在此后的 20 天内没有经历 7 天的干燥期
  • 您的问题实际上是关于如何在 R 中编写一个有点复杂的函数。我建议将其作为一个新问题发布,您可以忽略所有空间数据,并呈现一个包含降雨数据和首次尝试确定季风开始的功能。
  • 谢谢罗伯特,会按照建议做的。
  • 迟到的回复 - 但感谢您的指导。在重新审视了 R 和 Raster 数据类型的基础知识之后,它的效果非常好,我可以根据需要进行调整。
【解决方案2】:

我建议一个基本的两步过程。以 365 天为例:

set.seed(123)

r <- raster(ncol=40, nrow=20)

r_list <- list()

for(i in 1:365){
  r_list[[i]] <- setValues(r,rnorm(n=ncell(r),mean = 10,sd = 5))
}

APHRO <- brick(r_list)

对每次迭代使用基本逻辑测试:

r_list2 <- list()

for(i in 1:365){
  if(i != 365){
    r_list2[[i]] <- APHRO[[i]] >= 20 | APHRO[[i]] + APHRO[[i+1]] >= 20
  }else{
    r_list2[[i]] <- APHRO[[i]] >= 20
  }
}

按年计算总和:

NewLayer <- calc(brick(r_list2), fun=sum)

plot(NewLayer)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多