是否有类似于适用于栅格的 approx() 的 R 函数?

Is there an R function similar to approx() that works with rasters?

我有 RasterLayer 对象,其单元格 >100k,我试图根据 .csv 文件的两列和 20 行(参见下面的示例数据)插入值以创建新栅格。我已经使用 ggplot 从这 20 个数据点创建了一条响应曲线,并试图根据该曲线内的 20 个线段创建一个新的栅格。我的计划是使用执行查找的函数(类似于 ArcGIS 中的工具),并在栅格对象中插入落在 csv 文件中的值之间的值(这将是大多数单元格)。我正在尝试使用 raster::calc() 来完成此操作,使用 this post.

中描述的 approx()

我一直在尝试计算一个方程来近似 ggplot 曲线,但这相当复杂,并且在最终栅格中引入了超出可接受范围的更多误差​​。

这些是两列:'focal_var' 对应于输入栅格中值的潜在范围,'pointp' 列对应于要分配给输出栅格的值的范围。

focal_var pointp
0.8052998 0.098823205
1.834359811 0.110267362
2.863419821 0.122470704
3.892479832 0.135436234
4.921539842 0.149168837
5.950599853 0.163676304
6.979659863 0.178970181
8.008719874 0.195066436
9.037779884 0.211985998
10.06683989 0.229755227
11.09589991 0.248406296
12.12495992 0.267977361
13.15401993 0.288512216
14.18307994 0.310058975
15.21213995 0.332667215
16.24119996 0.3563831
17.27025997 0.381242275
18.29931998 0.40726082
19.32837999 0.434425128
20.35744 0.462682111

作为可管理的可重现示例:

library(raster)
r <- raster(ncol=10, nrow=10) #input raster
values(r) <- runif(ncell(r)) * 21
csv <- read.csv("csv_example.csv", header = TRUE) #lookup/interpolation table above

output_raster <- 
   calc(x = r, 
        fun = (with(csv,
                  approx(
                    x = focal_var,
                    y = pointp,
                    xout = r,
                    method = "linear",
                    rule = 2,
                    na.rm = TRUE
                  )))

其中returns这个错误:

Error in h(simpleError(msg, call)) : error in evaluating the argument 'fun' in selecting a method for function 'calc': no method for coercing this S4 class to a vector

我想知道是否有除 calc() 之外的函数可以与 approx() 结合使用栅格,因为这里的对象类型似乎存在问题,或者可能是完全不同的 combination/strategy 用于在 R 内插值栅格?

我对编码还是很陌生(这是我的第一个堆栈溢出问题),所以我很感激任何建议!谢谢!

那是因为您的函数 returns 是 data.table,然后您尝试将其应用于 one-dimensional 数据。在这种情况下,您可以先定义您的函数,将其保存到会话中,然后在计算中应用该函数。

Lines <- "focal_var pointp
0.8052998 0.098823205
1.834359811 0.110267362
2.863419821 0.122470704
3.892479832 0.135436234
4.921539842 0.149168837
5.950599853 0.163676304
6.979659863 0.178970181
8.008719874 0.195066436
9.037779884 0.211985998
10.06683989 0.229755227
11.09589991 0.248406296
12.12495992 0.267977361
13.15401993 0.288512216
14.18307994 0.310058975
15.21213995 0.332667215
16.24119996 0.3563831
17.27025997 0.381242275
18.29931998 0.40726082
19.32837999 0.434425128
20.35744 0.462682111"

csv <- read.csv(textConnection(Lines), header = TRUE, as.is = TRUE, sep = " ")

library(raster)
#> Loading required package: sp
#> Warning: multiple methods tables found for 'direction'
#> Warning: multiple methods tables found for 'gridDistance'
r <- raster(ncol=10, nrow=10) #input raster
values(r) <- runif(ncell(r)) * 21

c <- with(csv,
          approxfun(
            x = focal_var,
            y = pointp,
            method = "linear",
            rule = 2,
            na.rm = TRUE
          ))

output_raster <- calc(x = r, function(x){c(x)})

plot(r)

plot(output_raster)

reprex package (v2.0.1)

于 2022-01-24 创建