如何让R脚本批量处理多个数据目录下的.heat与.timestamp文件
解决方案
方案1:纯R内部批量处理(无需命令行调用,推荐优先使用)
这个需求可以完全在R内实现,不需要额外的命令行传参操作,只需要把你原有处理逻辑封装为函数,遍历所有子目录执行即可:
# 加载所需包,提前加载不要放在循环里 library(data.table) library(readr) # 你原代码用了write_tsv,需要依赖这个包,未安装可先执行install.packages("readr") # 定义所有子目录所在的根路径 root_dir <- "C:\\Users\\Zack\\Documents\\RScripts\\data" # 获取根目录下所有一级子目录的路径 sub_dirs <- list.dirs(root_dir, recursive = FALSE, full.names = TRUE) # 封装单目录处理逻辑为函数 process_one_dir <- function(dir_path) { # 切换到当前处理的子目录 setwd(dir_path) # 自动匹配当前目录下的.heat和.timestamp文件 heat_file <- list.files(pattern = "\\.heat$", full.names = FALSE)[1] time_file <- list.files(pattern = "\\.timestamp$", full.names = FALSE)[1] # 原有处理逻辑,已修正原代码存在的bug ts_heat = read.table(heat_file) ts_heat = ts_heat[-1,] rownames(ts_heat) <- NULL ts_time = read.table(time_file) back_heat = subset(ts_heat, V3 == 'H') back_time = ts_time$V1 # 修正原代码datDT未定义的问题 datDT <- as.data.table(ts_heat) datDT[, newcol := fcoalesce( nafill(fifelse(V3 == "H", back_time, NA_real_), type = "locf"), 0) ] last_heat = subset(datDT, V3 == 'H') last_time = last_heat$newcol # 修正原代码变量类型不匹配的问题,可根据你的实际数据结构调整取值列 x = back_time - last_heat$V1 dataest = data.frame(back_time , x) # 修正原代码变量名写错的问题 write_tsv(dataest, file="dataestimation.txt") } # 遍历所有子目录执行处理 lapply(sub_dirs, process_one_dir)
- 代码说明:会自动识别每个子目录下的.heat和.timestamp文件,处理完成后直接在对应子目录生成
dataestimation.txt
方案2:命令行传参版本(适合需要外部脚本调度的场景)
如果需要通过命令行传入路径执行,可以改造脚本支持参数传入:
# 放在脚本最开头,获取命令行传入的路径参数 args <- commandArgs(trailingOnly = TRUE) library(data.table) library(readr) process_one_dir <- function(dir_path) { # 此处和方案1的process_one_dir函数逻辑完全一致 setwd(dir_path) heat_file <- list.files(pattern = "\\.heat$", full.names = FALSE)[1] time_file <- list.files(pattern = "\\.timestamp$", full.names = FALSE)[1] ts_heat = read.table(heat_file) ts_heat = ts_heat[-1,] rownames(ts_heat) <- NULL ts_time = read.table(time_file) back_heat = subset(ts_heat, V3 == 'H') back_time = ts_time$V1 datDT <- as.data.table(ts_heat) datDT[, newcol := fcoalesce( nafill(fifelse(V3 == "H", back_time, NA_real_), type = "locf"), 0) ] last_heat = subset(datDT, V3 == 'H') last_time = last_heat$newcol x = back_time - last_heat$V1 dataest = data.frame(back_time , x) write_tsv(dataest, file="dataestimation.txt") } # 对所有传入的目录路径执行处理 lapply(args, process_one_dir)
调用方法:在命令行执行如下命令,可传入任意多个需要处理的子目录路径:
Rscript 你的脚本文件名.R "C:\Users\Zack\Documents\RScripts\data\blabladata1" "C:\Users\Zack\Documents\RScripts\data\blabladata2"
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

