You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R调用exact_extract提取栅格均值报summarise无适用方法错误

问题背景
  • 现有存储大量经纬度点位及对应火辐射功率(FRP)值的CSV文件,需完成如下空间分析流程:
    • 将CSV点位数据栅格化
    • 将生成的栅格与多面矢量网格图层叠加
    • 提取每个面要素覆盖范围内的FRP平均值
  • 此前使用exact_extract函数处理NetCDF格式多波段栅格可正常运行,本次处理CSV栅格化生成的单波段栅格时,执行提取语句触发报错。
复现代码
library(choroplethr)
library(choroplethrMaps)
library(ggmap)
library(exactextractr)   #For `exact_extract`
library(matrixStats)     #For `colWeightedMeans`
library(raster)          #For `brick`
library(sf)              #For `st_read`
library(stringr)         #For `str_sub`
library(tidyr)
library(dplyr)
library(RColorBrewer)
library(ncdf4) # netcdf处理包
library(rasterVis)
library(raster) # 栅格处理包
library(rgdal) # 地理空间分析包
library(ggplot2) # 绘图包
library(maptools)
library(rgeos)
library(maps)
library(data.table)
library(reshape)
library(doBy)

# 测试用CSV样例,实际场景加载体量更大的真实文件
viirs_2020 <- read.csv(text = "frp, lat, long,
1.43,46.73021,-92.0754,
1.27,46.72907,-92.0775,
1.8,40.72152,-84.1262,
1.23,41.63972,-87.1309,
0.82,41.61905,-87.3285,
1.61,41.64,-87.4095,
1.56,41.64461,-87.141, header=TRUE")

# 定义栅格的空间范围、分辨率与坐标系
viirs2020_r <- raster(xmn = -125, xmx = -65, ymn = 15, ymx = 55, res = 0.75, crs = "+proj=longlat +datum=WGS84")

# 将CSV点位转换为栅格
viirs2020_raster <- rasterize(viirs_2020[, c('long', 'lat')], viirs2020_r, viirs_2020[, 'frp'], fun=mean)
plot(viirs2020_raster)

# 加载野火范围的矢量网格图层
cp_grid <- st_read('Drop Effectiveness/data/map data/cameronpeak_grid.shp')
cp_grid <- st_transform(cp_grid, 4269)
cp_grid$id <- factor(cp_grid$id)

# 自定义函数:计算面要素覆盖范围内的栅格值加权平均
get_frp = function(values, coverage){
  values %>% summarize(across(everything(), ~ weighted.mean(.x, coverage, na.rm=TRUE)))
}

# 执行值提取(触发报错的语句)
out = exact_extract(viirs2020_raster, cp_grid, fun=get_frp, stack_apply=FALSE)
报错信息
in UseMethod("summarise") :
no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')"
报错原因

自定义的get_frp函数仅适配多波段栅格(如NetCDF读取生成的RasterStack/Brick对象)的输入场景:

  • 当输入为多波段栅格时,exact_extract向自定义函数传递的values参数是数据框结构,每列对应一个波段的栅格值,此时调用dplyr的summarise+across逐列计算加权平均可正常运行。
  • 本次通过rasterize生成的是单波段RasterLayer对象,exact_extract向自定义函数传递的values参数是普通数值型(double/numeric)向量,而summarise是专为数据框设计的泛型函数,没有针对数值向量的处理方法,因此触发方法不匹配的报错。
解决方案

二选一即可:

方案1:修改自定义函数,兼容单/多波段栅格输入

调整函数逻辑,先判断输入的values类型,对应不同的计算逻辑:

get_frp = function(values, coverage){
  # 单波段栅格场景:values为数值向量,直接计算加权平均
  if(is.vector(values)){
    return(weighted.mean(values, coverage, na.rm = TRUE))
  }
  # 多波段栅格场景:values为数据框,逐列计算加权平均
  values %>% summarize(across(everything(), ~ weighted.mean(.x, coverage, na.rm=TRUE)))
}

修改后重新执行exact_extract调用语句即可正常得到结果。

方案2:直接调用exactextractr内置加权平均方法,无需自定义函数

exact_extract原生支持按栅格覆盖面积加权的均值计算,直接传入内置函数名即可,代码更简洁且不存在类型兼容问题:

out <- exact_extract(viirs2020_raster, cp_grid, fun = "weighted.mean", na.rm = TRUE)
# 若需将结果绑定到矢量图层属性表,可直接赋值
cp_grid$mean_frp <- out

内容的提问来源于stack exchange,提问作者JohnnyJohnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:24:30