【问题标题】:R: Use raster package to calculate the number of consecutive TRUE valuesR:使用光栅包计算连续TRUE值的数量
【发布时间】:2014-08-29 15:38:24
【问题描述】:

我正在尝试查找一组栅格满足特定条件的连续天数。在这种情况下,我想弄清楚一年中每个 30 天是否有连续 10 天没有下雨。

因为我正在使用大量数据,所以我需要想出一种有效的方法来做到这一点。即试图避免在所有光栅单元中使用循环。

我找到了一个可能使事情变得更简单的函数,但我不知道如何将它有效地应用于所有栅格单元。这是一个如何轻松完成的示例。这是一种非常快速地计算连续 TRUE 数量的方法。

z =3

现在的问题是如何(如果可能)有效地将其应用于所有单元格。堆栈应用?计算?不确定。

这里有一个示例栅格堆栈以提供帮助:

   set.seed(42)
    require(raster)
    r1 <- raster(nrows=10, ncols=10)
    r2=r3=r4=r5=r1
    r1[]= runif(ncell(r1))
    r2[]= runif(ncell(r1))
    r3[]= runif(ncell(r1))
    r4[]= runif(ncell(r1))
    r5[]= runif(ncell(r1))
    rs=stack(r1,r2,r3,r4,r5)<.25

【问题讨论】:

  • 你为什么使用raster对象而不是简单的矩阵(或3D arrays,如果需要)?除此之外,您是将一年分为 12 个不相交的 30 天区块,还是要对每个 30 天序列进行滚动测试?
  • 它们以 .tif 文件的形式读入,因此将它们保留为光栅堆栈似乎很自然(只是一个多维数组),但愿意切换。最终,我将让它每 30 天滚动一次。
  • 我将其保留为栅格,但使用提取循环遍历单元格。
  • 使用 calc(rs, fun) 其中 fun 是您的函数(适用于向量值,代表单个单元格

标签: r stack apply raster


【解决方案1】:

虽然我确信有更好的方法来做到这一点。这是一种可能性:

threeconsecutive = function(rasterin){
     s = rasterToPoints( rasterin )
     X = s[,'x']
     Y = s[,'y']
     s = s[,3:dim(s)[2]]
     s  = apply(s,MARGIN=1, function(x){max( rle(c(x))$lengths[rle(c(x) )$values==T], na.rm=T )>=3} )
     return(rasterFromXYZ( data.frame(x=X,y=Y,true=s) ))
 }
out = threeconsecutive(rs)
plot(out)

【讨论】:

猜你喜欢
  • 2017-07-22
  • 2017-03-20
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2019-03-14
  • 2015-06-09
  • 2022-10-07
  • 1970-01-01
相关资源
最近更新 更多