R语言清理遥感波段数据框列名 适配随机森林建模
R语言遥感波段数据框列名规范方案
第一步:提取日期与波段核心信息
原列名的中间时间部分长度不固定,用正则表达式可以精准匹配并剔除可变内容,保留日期和波段名:
# 捕获日期(YYYY-MM-DD)和末尾波段名,剔除中间可变字符 temp_names <- sub("^t(\\d{4}-\\d{2}-\\d{2})T.*_(.*)$", "\\1_\\2", colnames(Bands_reflectance_2017)) # 将日期横杠替换为下划线,得到如"2017_12_31_red_edge_3"的格式 cleaned_names <- gsub("-", "_", temp_names)
正则说明:^t(\\d{4}-\\d{2}-\\d{2})T.*_(.*)$中,(\\d{4}-\\d{2}-\\d{2})锁定开头的日期部分,T.*_匹配从T到最后一个下划线的所有可变字符,(.*)$捕获末尾的完整波段名,替换时仅保留这两个核心部分。
第二步:映射波段编码与月份转英文
先定义波段映射规则(根据你的实际波段调整),再拆分日期和波段,分别处理后组合成规范列名:
# 自定义波段名到编码的映射表 band_mapping <- c( "blue" = "B2", "green" = "B3", "red" = "B4", "red_edge_1" = "B5", "red_edge_2" = "B6", "red_edge_3" = "B7", "nir_1" = "B8", "nir_2" = "B8A", "swir_1" = "B11", "swir_2" = "B12" ) # 拆分清理后的列名为日期段和波段段 name_parts <- strsplit(cleaned_names, "_", fixed = TRUE) # 生成最终规范列名 final_names <- sapply(name_parts, function(parts) { # 提取日期组件 month_num <- as.integer(parts[2]) day <- parts[3] # 拼接含下划线的波段名(如red_edge_3) band_name <- paste(parts[4:length(parts)], collapse = "_") # 月份数字转英文名称 month_name <- month.name[month_num] # 波段名替换为编码 band_code <- band_mapping[band_name] # 组合成"B7_December31"格式 paste0(band_code, "_", month_name, day) }) # 将规范列名赋值回数据框 colnames(Bands_reflectance_2017) <- final_names
补充处理(可选)
如果存在重复的规范列名(如同一天同一波段的多期数据),可以用以下代码自动添加序号区分,避免建模时的列名冲突:
final_names <- make.names(final_names, unique = TRUE)
内容的提问来源于stack exchange,提问作者Nangula
相关产品推荐
相关产品推荐

