我是R的新手,很难解决这个问题,因此请给予任何帮助. 我拥有每日洪水网格数据,用于计算某些位置周围的缓冲区中洪水的加权平均值.我在Q地理信息系统中清理了网格,并使用R通过以下行计算加权平均值:

library(sp)
library(raster)
library(ggplot2)
library(sf)

     # Load the raster file into R
      flooding_raster_data <- raster(raster_file)
      
      # Print information or perform further processing as needed
      print(paste("Loaded raster file:", raster_file))
      
      # Extract values from the raster that fall within the buffer polygons
      raster_values_in_buffer_weight <- extract(flooding_raster_data, buffer, fun = mean, na.rm = TRUE, weights=TRUE)
      
      # Create a new buffer object with the extracted floodshare values
      buffer_with_mean <- st_as_sf(buffer)
      buffer_with_mean$floodshare <- raster_values_in_buffer_weight
      
      # Write the sf object to a shapefile
      st_write(buffer_with_mean, output_file_path, append = FALSE)
      rm(flooding_raster_data, buffer_with_mean, raster_values_in_buffer_weight, raster_file)

我的问题是,对于没有数据(在Q地理信息系统中编码为无数据)的网格,缓冲区的加权平均值为0.我已经将其与Q地理信息系统中的分区平均值进行了判断,而这些相同的缓冲区在Q地理信息系统中的分区平均值为空.我很难弄清楚为什么R会发生这种情况,因为我认为R会导致平均NA或缺失,所以如果有人知道为什么,请告诉我以及我如何解决这个问题.再说一次,我完全是R初学者,所以我可能错过了一些非常明显的东西.

我试图使na.rm = RST,因为我认为问题可能出在R代码中处理NA值的方式上,但这只会使所有加权平均值为空,所以我想我不明白R如何处理丢失的数据.

EDIT

我go 判断了文档中的R extract,并 Select 了他们的示例代码,但将格栅值更改为NA,并且如果所有格栅值都是NA,它确实会将提取值的加权平均值为0作为多边形.为什么当其他所有内容都给出NA或NaN时,它没有给出NA作为加权平均值.我已在下面添加了复制代码.

###############################
# extract values with lines
###############################
r <- raster(ncol=36, nrow=18, vals=NA)
cds1 <- rbind(c(-50,0), c(0,60), c(40,5), c(15,-45), c(-10,-25))
cds2 <- rbind(c(80,20), c(140,60), c(160,0), c(140,-55))
lines <- spLines(cds1, cds2)

extract(r, lines)

###############################
# extract values with polygons
###############################
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- spPolygons(cds1, cds2)

v <- extract(r, polys)
# mean for each polygon
mean_polyg <- unlist(lapply(v, function(x) if (!is.null(x)) mean(x, na.rm=TRUE) else NA ))
print(mean_polyg)

# weighted mean
v <- extract(r, polys, weights=TRUE, fun=mean, na.rm = TRUE)
print(v)

推荐答案

自2023年10月被废弃以来,rastersp制作了许多"怪癖".除非您绝对需要使用它们,否则最好避免使用它们.我不能确定这是否是rastersp过时的结果,但您可以使用terrasf包实现所需的输出:

library(sf) # 1.0-16 
library(terra) # terra 1.7.71
library(dplyr)

# Example sf to represent extent of example raster data and to use as mask
sf_poly <- st_read(system.file("shape/nc.shp", package = "sf")) %>%
  slice(1) %>%
  st_transform(4326) %>%
  select(geometry)

# Get extent of sf_poly
st_bbox(sf_poly)

#      xmin      ymin      xmax      ymax 
# -81.74091  36.23444 -81.23971  36.58973 

# Generate an example raster with -Inf values using st_bbox(sf_poly) values
r <- rast(ncols = 50, nrows = 50, nlyrs = 1, 
          xmin = -81.74091, xmax = -81.23971, 
          ymin = 36.23444, ymax = 36.58973, 
          names = "rast_val", 
          crs = "EPSG:4326") %>%
  init("cell") %>%
  crop(sf_poly, mask = TRUE) %>%
  ifel(is.na(.), -Inf, .)

# Create example polys sf (note id == 1 is outside extent of non-na/-Inf raster values)
polys <- data.frame(id = rep(1:4, each = 2),
                      lon = c(-81.7, -81.68, -81.6, -81.55, -81.4, -81.4, -81.3, -81.3),
                      lat = c(36.25, 36.33, 36.25, 36.40, 36.3, 36.55, 36.25, 36.36)) %>%
  st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
  summarise(geometry = st_combine(geometry), .by = id) %>% 
  st_cast("LINESTRING") %>%
  st_buffer(800)

现在将这些-Inf值转换为NA(如果它们在实际数据中已经是NA,则跳过):

r <- ifel(r == -Inf, NA, r)

最后,计算多边形中每个多边形的加权平均值:

v <- extract(r, polys, weights = TRUE, fun = mean, na.rm = TRUE)
v
#   ID rast_val
# 1  1      NaN
# 2  2 1689.657
# 3  3 1169.131
# 4  4 1627.674

R相关问答推荐

收件箱摘要表布局在第一列上显示子类别

R中的Fasttext langue_identification返回太多参数-如何与文本匹配?

如何生成包含可能条目列表而不是计数的表?

强制相关图以显示相关矩阵图中的尾随零

在R中使用自定义函数时如何删除该函数的一部分?

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

R Sapply函数产生的值似乎与for循环方法略有不同

使用sf或terra的LINESTRAING的累积长度

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

安全地测试文件是否通过R打开

如何在PDF格式的kableExtra表格中显示管道字符?

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

将摘要图添加到facet_WRAP gglot的末尾

如何使用字符串从重复的模式中提取多个数字?

在r中整理图例和堆叠图的问题

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

如何在GALT包的函数&geom_x样条线中调整线宽

如何从嵌套数据中自动创建命名对象?在R中