You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言按复杂规则批量转换向量字符串的简便实现方法

R语言自定义文件名向量转换实现方案

通过正则表达式捕获组直接提取文件名中所有需要的字段,再按目标格式拼接即可,无需逐位计数,可自动适配code字段为1位/2位的场景。

方法1:基础R实现(无需安装额外包)

# 加载原始数据
all.images <-c("S2A2A_20160615_124_AguaSumidaPR001120160629_BOA_10.tif",
               "S2A2A_20160705_124_AguaSumidaPR0011020160629_BOA_10.tif",
               "S2A2A_20160712_081_AguaSumidaPR001120160629_BOA_10.tif",
               "S2A2A_20170501_124_AguaSumidaPR001120170427_BOA_10.tif",
               "S2A2A_20170508_081_AguaSumidaPR001120170427_BOA_10.tif")

# 定义正则匹配规则,按顺序捕获6个目标字段
match_pattern <- "^S2A2A_(20\\d{6})_(\\d{3})_([A-Za-z]+)(PR\\d{3})(\\d+)(20\\d{6})_BOA_\\d+\\.tif$"

# 提取所有分组为数据框
file_info <- strcapture(
  pattern = match_pattern,
  x = all.images,
  proto = list(
    sensor_date = character(),
    orbit = character(),
    site_name = character(),
    pr_code = character(),
    num_code = character(),
    prod_date = character()
  )
)

# 将产品日期格式化为yyyy-mm-dd格式
file_info$prod_date_fmt <- paste0(
  substr(file_info$prod_date, 1, 4), "-",
  substr(file_info$prod_date, 5, 6), "-",
  substr(file_info$prod_date, 7, 8)
)

# 按要求拼接为新向量
all.images.new <- paste0(
  file_info$site_name, "_",
  file_info$pr_code, "_",
  file_info$num_code, "_",
  file_info$prod_date_fmt, "_",
  file_info$sensor_date, "_",
  file_info$orbit
)

运行后输出结果完全匹配目标格式:

> all.images.new
[1] "AguaSumida_PR001_1_2016-06-29_20160615_124"
[2] "AguaSumida_PR001_10_2016-06-29_20160705_124"
[3] "AguaSumida_PR001_1_2016-06-29_20160712_081"
[4] "AguaSumida_PR001_1_2017-04-27_20170501_124"
[5] "AguaSumida_PR001_1_2017-04-27_20170508_081"

方法2:stringr包实现(代码更简洁)

如果已安装tidyverse系列工具包,可使用str_match简化提取逻辑:

library(stringr)

# 原始数据定义与方法1一致
all.images <-c("S2A2A_20160615_124_AguaSumidaPR001120160629_BOA_10.tif",
               "S2A2A_20160705_124_AguaSumidaPR0011020160629_BOA_10.tif",
               "S2A2A_20160712_081_AguaSumidaPR001120160629_BOA_10.tif",
               "S2A2A_20170501_124_AguaSumidaPR001120170427_BOA_10.tif",
               "S2A2A_20170508_081_AguaSumidaPR001120170427_BOA_10.tif")

match_res <- str_match(all.images, match_pattern)

all.images.new <- paste0(
  match_res[,4], "_",
  match_res[,5], "_",
  match_res[,6], "_",
  str_replace(match_res[,7], "(\\d{4})(\\d{2})(\\d{2})", "\\1-\\2-\\3"), "_",
  match_res[,2], "_",
  match_res[,3]
)

说明:原始输入中第二个文件名的AguaSumidaPR0010120160629段存在笔误,若要得到code=10的输出,该段应为AguaSumidaPR0011020160629(PR001后为10而非01),否则会提取到code=01,与目标输出不符。只要整体文件名结构不变,上述代码可自动适配不同站点名、PR编号、code长度的场景,无需额外修改。

内容的提问来源于stack exchange,提问作者Leprechault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.16 16:15:41