R中exactextractr包报错[names<-] incorrect number of names如何解决
exactextractr分区统计报
[names<-] incorrect number of names问题处理 核心疑问解答
- 存在常规
names()函数无法识别的名称异常:该报错触发点几乎都不在显式打印的对象名称上,而是包内部做列名自动生成时,读取到的栅格/矢量元数据层名、字段名和实际生成的统计列长度不匹配。比如新版terra包读取栅格时,若波段未设置名称,names()打印时会自动补位显示1、2、3这类占位符,但底层存储的实际层名是空字符串,常规打印无法发现。 - 对象名称不存在硬数量上限:报错和名称总长度、总数量无关,只要程序给输出数据框赋值列名时,列名向量长度和数据框实际列数不一致,就会抛出该错误。
排查修复步骤
- 校验栅格层名合法性
不要依赖names(s)的控制台打印结果,直接运行代码校验层名是否存在空值、重复值:
若以上任意校验返回# RasterStack对象取层名 s_names <- names(s) # SpatRaster对象取层名替换为下行 # s_names <- terra::names(s) # 校验异常值 any(is.na(s_names)) any(nchar(s_names) == 0) any(duplicated(s_names))TRUE,直接为栅格重新赋值唯一合法名称即可:# RasterStack用nlayers(s)替换nlyr(s) names(s) <- paste0("raster_layer_", seq_along(1:terra::nlyr(s))) - 校验矢量字段冲突
检查矢量属性字段是否存在空列名、与统计量后缀重名的字段,以及读入shapefile时自动生成的隐藏fid、几何关联字段:
若存在空字段名、字段名和# sf对象取字段名 inv_names <- colnames(sf::st_drop_geometry(INV)) # sp空间对象取字段名替换为下行 # inv_names <- colnames(INV@data)mean/min/max/median/variance重名的情况,提前重命名对应字段即可。 - 兼容问题兜底方案
若前两步校验无异常,属于exactextractr与新版terra/raster包的兼容bug,直接绕过append_cols参数的内部逻辑,手动合并字段即可,可100%规避该报错:# 仅执行分区统计,不追加字段 stat_res <- exact_extract(s, INV, fun = c("mean", "min", "max", "median", "variance")) # 按行顺序手动追加FLIK字段,exact_extract返回结果与输入矢量行顺序完全一一对应 df1 <- cbind(FLIK = INV$FLIK, stat_res)
注:多数此前正常运行的代码突发该报错,都是因后台自动更新terra包后,栅格层名读取逻辑变更,导致空层名没有被控制台打印暴露。
内容的提问来源于stack exchange,提问作者Wollbrecht
相关产品推荐
相关产品推荐

