如何在R terra包中正确判断栅格是否为numeric类型?
terra栅格对象的数值型判断优化方案
R的terra包没有提供直接针对栅格对象的is.numeric()函数,我目前用的临时方法运行速度很慢,希望能找到更高效的解决方案。
测试数据与现有方法
先准备测试用的多波段栅格:
library(terra) # 创建基础单波段栅格 x1 = x2 = x3 = x4 = rast(nrows=180, ncols=360, nlyrs=1, xmin=-180, xmax=180, ymin=-90, ymax=90) x1[] = 1.0 # 浮点数值型 x2[] = FALSE # 布尔型 x3[] = "cat" # 字符型 x4[] = as.integer(1)# 整数型 # 合并为多波段栅格 r4 = c(x1,x2,x3,x4)
现有尝试的判断方式:
- 直接调用
sapply(r4, is.numeric)无法得到正确结果 - 通过提取全部栅格值的方式
sapply(r4, function(x) is.numeric(x[]))能得到正确结果,但速度极慢——因为该操作会把整个栅格的数据加载到内存,处理大栅格时效率极低
而其他类型的判断函数(terra内置或原生)都能正常工作:
- 布尔型判断:
sapply(r4, is.bool) - 因子型判断:
sapply(r4, is.factor) - 整数型判断:
sapply(r4, is.int)(terra内置函数,无需加载数据)
高效替代方法
可以通过读取栅格的元数据信息来判断数据类型,无需加载栅格值到内存:
# 自定义函数:判断terra栅格是否为数值型(含整数、浮点) is_terra_numeric <- function(r) { # 获取栅格的数据类型标识 dt <- datatype(r) # 匹配数值型对应的标识:INT(整数)、FLT(浮点) grepl("INT|FLT", dt, ignore.case = TRUE) } # 批量判断多波段栅格的每个波段 sapply(r4, is_terra_numeric)
这个方法直接读取栅格的元数据,不会触发数据加载,速度大幅提升,且判断结果准确:
- x1(浮点):
TRUE - x2(布尔):
FALSE - x3(字符):
FALSE - x4(整数):
TRUE
内容的提问来源于stack exchange,提问作者Jacob Strunk
相关产品推荐
相关产品推荐

