Windows系统下如何让R脚本批量处理所有成对的.heat与.timestamp数据
R脚本批量处理配对.heat/.timestamp文件实现方案
前置说明
原脚本存在几个需要先修正的逻辑问题,已在批量实现方案中同步修复:
- 未定义
datDT变量就直接赋值newcol字段 write_tsv调用的变量名dataestimation和之前定义的dataest不一致- 时间差计算逻辑中
back_time - last_heat维度不匹配的问题
本次批量实现的核心逻辑为:先匹配工作目录下相同前缀的.heat和.timestamp文件,再把单组处理逻辑封装为函数循环调用,输出结果按原文件前缀命名避免覆盖。
完整批量处理脚本
# 提前加载依赖包,避免循环中重复加载 library(data.table) library(readr) # 设置工作目录,替换为你的实际存储路径 setwd('C:\\Users\\Zack\\Documents\\RScripts') # 1. 提取目录下所有对应后缀的文件 heat_files <- list.files(pattern = "\\.heat$", ignore.case = TRUE) time_files <- list.files(pattern = "\\.timestamp$", ignore.case = TRUE) # 2. 提取文件名前缀做配对校验 get_prefix <- function(filename) { sub("\\.[^.]*$", "", filename) # 去掉文件末尾的后缀名 } heat_prefixes <- sapply(heat_files, get_prefix) time_prefixes <- sapply(time_files, get_prefix) # 3. 筛选同时存在两类文件的配对前缀 common_prefixes <- intersect(heat_prefixes, time_prefixes) if (length(common_prefixes) == 0) { stop("未找到配对的.heat和.timestamp文件,请检查工作目录是否正确") } # 4. 封装单组文件的处理函数 process_one_pair <- function(prefix) { # 读取对应配对文件 heat_path <- paste0(prefix, ".heat") time_path <- paste0(prefix, ".timestamp") ts_heat <- read.table(heat_path) ts_heat <- ts_heat[-1,] # 保留原逻辑删除首行 rownames(ts_heat) <- NULL setDT(ts_heat) # 转成data.table格式,修复原脚本未定义datDT的问题 setnames(ts_heat, old = "V3", new = "track") # 对齐原逻辑的track字段命名 ts_time <- read.table(time_path) back_time <- ts_time$V1 back_heat <- ts_heat[track == 'H'] # 保留原逻辑计算newcol列 ts_heat[, newcol := fcoalesce( nafill(fifelse(track == "H", back_time, NA_real_), type = "locf"), 0 )] last_heat <- ts_heat[track == 'H'] last_time <- last_heat$newcol # 修复原维度不匹配问题,可根据你的实际数据逻辑调整 x <- back_time[1:nrow(last_heat)] - last_time dataest <- data.frame(back_time = back_time[1:nrow(last_heat)], x = x) # 按原文件前缀输出结果,避免文件覆盖 output_file <- paste0(prefix, "_dataestimation.txt") write_tsv(dataest, file = output_file) message("处理完成:", prefix, ",结果已导出为", output_file) } # 5. 批量处理所有配对文件 sapply(common_prefixes, process_one_pair)
注意事项
- 运行前请确保已经安装依赖包,未安装可先执行
install.packages(c("data.table", "readr")) - 如果你的.heat文件首行是表头,可在
read.table参数中添加header = TRUE,根据你的实际数据格式调整即可 - 若内置的计算逻辑和你的实际需求有出入,仅需修改
process_one_pair函数内的对应计算部分即可
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

