如何在 r 中叠加 2 个以上的文件?

问题描述 投票:0回答:1

我们可以像这样从 2 个堆栈中计算相应层的平均值。

library(raster)
s1 <- stack(system.file("external/rlogo.grd", package="raster")) 
s2 <- sqrt(s1)
m4 <- overlay(s1, s2, fun=function(x) mean(x, na.rm=TRUE))

我在一个文件夹中有几个文件:

 data<- list.files ("C:data\\", ".nc", full.names = TRUE)
 for (i in 1:length(data)){
     nn=stack(dff[i])
     res=nn[[1:8]]
     ...............}

如何将覆盖功能应用于所有资源

r raster terra
1个回答
0
投票

用“terra”(替换“raster”)更容易做到这一点,

示例数据

library(terra)
s1 <- rast(system.file("ex/logo.tif", package="terra"))   
s2 <- sqrt(s1)

使用两个 SpatRaster 获得“平行”均值的解决方案:

mean(s1, s2)

#class       : SpatRaster 
#dimensions  : 77, 101, 3  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
#coord. ref. : Cartesian (Meter) 
#source(s)   : memory
#names       :      red,    green,     blue 
#min values  :   0.0000,   0.0000,   0.0000 
#max values  : 135.4844, 135.4844, 135.4844 

或者像这样

app(sds(s1, s2), mean)

如果你有很多文件(SpatRasters)你可以这样做:

f <- system.file("ex/logo.tif", package="terra")
ff <- rep(f, 5)

s <- sds(ff)
app(s, mean)

# or 
x <- lapply(ff, rast)
do.call(mean, x)

# or
x <- lapply(ff, rast)
app(sds(x), mean)

要在计算之前对每个 SpatRaster 进行子集化,您可以这样做

x <- lapply(ff, \(f) rast(f)[[1:2]])
do.call(mean, x)

或(但目前已损坏)

s <- sds(ff)
s <- s[, 1:2,drop=FALSE]
app(s, mean)

当然,您也可以使用

[[1:2]]

对输出进行子集化

请注意,要获得所有层的平均值,您可以改为这样做

mean(c(s1, s2))
# or
app(c(s1, s2), mean)
© www.soinside.com 2019 - 2024. All rights reserved.