目前,我有一个.csv文件,其中包含与每个地理点相关联的一系列lat/lon点。我想要做的是把这个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) # package for netcdf manipulation
library(rasterVis)
library(raster) # package for raster manipulation
library(rgdal) # package for geospatial analysis
library(ggplot2) # package for plotting
library(maptools)
library(rgeos)
library(maps)
library(data.table)
library(reshape)
library(doBy)
# TOY .csv file, in real code I load in a much larger file
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")
# setting extent + projection for raster data
viirs2020_r <- raster(xmn = -125, xmx = -65, ymn = 15, ymx = 55, res = 0.75, crs = "+proj=longlat +datum=WGS84")
# converting .csv file into a raster
viirs2020_raster <- rasterize(viirs_2020[, c('long', 'lat')], viirs2020_r, viirs_2020[, 'frp'], fun=mean)
plot(viirs2020_raster)
# Load in shapefile which is a grid over a wildfire
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)
#Function for taking the mean of values within shapes in coverage
get_frp = function(values, coverage){
values %>% summarize(across(everything(), ~ weighted.mean(.x, coverage, na.rm=TRUE)))
}
###extract the averages
out = exact_extract(viirs2020_raster, cp_grid, fun=get_frp, stack_apply=FALSE)过去,我在不同的项目上成功地使用了带有exact_extract文件的NetCDF函数,成功地做到了这一点。但是,当我试图使用光栅化的.csv文件执行此任务时,我在上面粘贴的代码的最后一行中会出现以下错误:
"in UseMethod("summarise") :
no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')"有人知道是什么导致了这个错误吗?
发布于 2022-07-05 21:06:52
我无法通过更改我编写的自定义函数来解决这个问题。然而,我能够复制这个过程,首先做一个简单的'exact_extract‘,然后计算之后的加权平均值。
out = exact_extract(viirs2020_raster, cp_grid)
# Create data frame from extraction
frp_combined <- bind_rows(out, .id = "id") %>%
as_tibble()
# Create a weighted mean based on values and coverage of raster
frp_by_id <- frp_combined %>%
#--- convert from character to numeric ---#
mutate(id = as.numeric(id)) %>%
#--- group summary ---#
group_by(id) %>%
summarise(frp_aw = sum(value * coverage_fraction) / sum(coverage_fraction))
# Merge extracted values to each polygon
cameronpeak.frp <- cp_grid %>%
mutate(id := seq_len(nrow(.))) %>%
left_join(., frp_by_id, by = "id") %>%
dplyr::select(id, frp_aw) 发布于 2022-07-03 17:21:26
我认为这个问题是因为缺少{{ }}来包装变量名coverage。
尝试以下几点
#Function for taking the mean of values within shapes in coverage
get_frp = function(values, coverage){
values %>% summarize(across(everything()), ~ weighted.mean(.x, {{coverage}}, na.rm=TRUE))
}关于这个的更多信息:https://rlang.r-lib.org/reference/topic-metaprogramming.html
https://stackoverflow.com/questions/72756233
复制相似问题