【问题标题】:Select specific rasters from stack and make a new stack in R从堆栈中选择特定栅格并在 R 中创建一个新堆栈
【发布时间】:2017-09-23 19:33:42
【问题描述】:

我有一堆植被趋势栅格,1982-2013 年间每年都有一层。此外,我在矢量中有一些数据,我想与栅格进行比较。 Unfurtunalety 这个矢量数据不完整,有些年份没有值。

有没有办法只使用与我的向量数据具有值的年份相对应的栅格来创建一个新堆栈?我有 180 个向量,所以如果我可以避免为每个向量手动执行此操作,我会很高兴。

我不知道如何做到这一点,所以如果您有任何建议,请分享。

这是我的数据的示例:

#yearly vegetation trend residuals
res <- list.files(pattern="*res.tif")
s <- stack(res)

> s
class       : RasterStack 
dimensions  : 2160, 4320, 9331200, 32  (nrow, ncol, ncell, nlayers)
resolution  : 0.08333333, 0.08333333  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
names       :  X1982res,  X1983res,  X1984res,  X1985res,  X1986res,  X1987res,  X1988res,  X1989res,  X1990res,  X1991res,  X1992res,  X1993res,  X1994res,  X1995res,  X1996res, ... 
min values  : -1646.886, -1783.155, -1597.452, -1296.460, -1339.577, -1396.953, -1147.745, -1135.821, -1245.651, -1239.484, -1271.816, -1326.402, -1119.192, -1251.991, -1137.646, ... 
max values  :  619.8672,  602.8412,  616.0391,  654.5453,  506.0248,  569.0380,  602.9570,  605.4675,  642.4062,  571.4812,  631.8979,  604.1268,  581.0545,  692.8349,  697.4185, ... 

#table with vectors
vectors <- df[6:11,4:35]
> vectors
   X1982 X1983 X1984 X1985    X1986 X1987 X1988    X1989   X1990 X1991
6     NA    NA    NA    NA 26.90000    NA  28.0 25.85000 26.9000 29.60
7   24.5 25.10  25.1 28.15 35.85714 27.95  30.6 30.28750 37.6625 30.05
8     NA 31.00    NA    NA       NA 27.15    NA       NA      NA 26.30
9     NA    NA    NA    NA 26.60000    NA  31.7 30.36667 34.5000    NA
10    NA    NA    NA    NA 48.10000    NA  40.6 44.50000      NA 41.80
11    NA 34.35    NA 26.92 31.87500    NA  28.2 38.00000      NA 27.57
   X1992 X1993 X1994  X1995    X1996  X1997 X1998 X1999    X2000    X2001
6  35.50 36.60  32.1 38.100 52.64000     NA  46.0 36.22 48.60000 35.36000
7  30.65 30.85  30.4 37.810 34.82500 34.775  39.2 33.15 36.88333 32.44800
8     NA    NA  28.0 27.350 26.00000 25.800  24.0 26.00 24.90000 24.00000
9  36.10    NA  42.8 40.275 45.80000 46.200  46.2    NA 40.35000 41.28333
10 41.90 45.30    NA     NA       NA     NA    NA    NA       NA 57.50000
11 32.65    NA    NA 32.940 39.23333     NA    NA    NA 33.41000       NA
   X2002    X2003  X2004  X2005   X2006  X2007   X2008  X2009   X2010 X2011
6  35.34 45.24333 41.505 39.695 36.2450 30.015 32.3050 32.540 33.6350 34.21
7  30.90 32.65500 35.800     NA      NA     NA 36.1660     NA 35.3680 28.30
8     NA 27.40000 31.054 31.855 32.3725 32.695 32.8625 33.675 33.2875 28.80
9  34.08 18.81000 16.230 16.640      NA     NA 31.7900     NA      NA    NA
10    NA 48.00000 43.000     NA      NA     NA      NA     NA      NA    NA
11    NA       NA     NA 41.300      NA     NA      NA     NA 41.5575    NA
   X2012 X2013
6  30.48 31.54
7  32.40    NA
8  29.04 27.00
9     NA    NA
10    NA    NA
11    NA    NA
> 

【问题讨论】:

  • 您能提供一个数据示例吗?这可能是dplyr 包中filter 函数的一个简单用例。
  • “我的矢量数据在哪里有值”是什么意思?
  • 我的意思是我不想在我的矢量文件中包含与 No Data 匹配的年份。
  • 我还不清楚。你有一个 32 层的堆栈,然后是一个矩阵,vectorsvectors 的行和列与堆栈层有何关系?如果层对应vectors的列,那么这些列是怎么进来的呢?您是否只想保留相应列具有 no NA 的层?
  • @jbaums 已经写道:您的问题缺少基本信息。请尝试提供minimal reproducible example 并查看how to write a good R question。注意:可以综合创建Raster*Objects就像您可以通过代码创建一定长度的向量(例如x &lt;- c(1,2,3,NA,5)),您可以创建RasterLayers 或RasterStacks通过代码。因此,我们能够重现您的示例。

标签: r stack raster


【解决方案1】:

虽然现在回答上面的问题为时已晚,但我认为值得回答,以防其他人有类似的问题。

对于这类问题,我认为您可以过滤您的矢量,只保留您想要制作新栅格堆栈的年份。我认为可以根据他们的数据类型和意图来操纵这部分。他们所需要的只是有一个年的向量。之后,他们可以按照以下方法对相应的栅格进行子集化。

sub <- raster::subset(rastStack, index) # here, rastStack is the raster stack and index is the vector of years, however the layers of raster stack should have year in the layer name.

如果打算从栅格堆栈中的每个第 i 个栅格的堆栈中创建一个栅格,则可以应用以下方法。例如,我有一个栅格堆栈,其中包含 49 年的月平均降水量值。我想要的是在此期间每个月制作一个平均栅格,这样我将只有 12 个栅格作为 49 年的平均值。这意味着我的第一个栅格将是 1 月的平均值,使用 49 年中所有 1 月月份的平均值,其他月份也是如此,依此类推。

rasList <- list.files("your path of folder here", pattern = ".tif$", full.names = T) # take all rasters from a folder
rastStack <- stack(rasList) 

mon <- seq(1,12, 1) # vector representing months
li <- 1:588 # nlyears in the raster stack. 12 month in a year, I had rasters for 49 years. therfore a total of 12*49 or 588 raster layers 
for (ii in 1:length(mon)){
  index <- li[seq(ii, length(li), 12)]
  sub <- raster::subset(rastStack, index)
  subMean <- calc(sub, fun = mean) # this can be any function
  writeRaster(subMean, paste("your destination folder to save the output rasters", "month_", ii, ".tif", sep = ""))
} 

或者,任何人都可能打算按顺序制作光栅堆栈。例如,该人可能想要为每第 n 层制作一个栅格堆栈。这意味着第一组堆栈可以是前 10 个栅格,第二组堆栈可以是第二个 10 个栅格,依此类推。在这种情况下,可以在 post 中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多