如何在R中迭代读取文件并按站点生成分离式CSV输出?
按站点(州)生成独立的15分钟均值CSV文件(R实现)
核心处理逻辑
- 遍历所有按州划分的顶层文件夹
- 对每个州文件夹下的分钟级txt文件,保留原有注释行跳过、列名调整逻辑
- 计算每15行(对应15分钟)的均值
- 将单个州的所有处理结果合并,输出为以州名命名的独立CSV
完整实现代码
# 设置根目录:所有州文件夹的上级目录,请替换为你的实际路径 root_dir <- "/your/root/folder/path" # 获取所有州(站点)文件夹的路径 state_folders <- list.dirs(root_dir, recursive = FALSE) # 遍历每个州文件夹 for (state_folder in state_folders) { # 提取州名(从文件夹路径中截取最后一段) state_name <- basename(state_folder) # 获取当前州下所有的txt数据文件 txt_files <- list.files(state_folder, pattern = "\\.txt$", full.names = TRUE) # 初始化空数据框,存储当前州的所有处理结果 state_results <- data.frame() # 遍历当前州下的每个txt文件 for (file in txt_files) { # 跳过注释行:假设注释行以#开头,可根据实际格式修改匹配规则 raw_lines <- readLines(file) valid_lines <- raw_lines[!grepl("^#", raw_lines)] df <- read.table(text = valid_lines, header = FALSE, sep = "\t") # 分隔符根据你的文件实际情况调整 # 调整列名:替换为你原有代码中的列名定义 colnames(df) <- c("record_time", "temp", "humidity", "pressure") # 生成15行分组标识,处理行数不是15倍数的情况(最后一组不足15行也保留) df$group_id <- gl(nrow(df) %/% 15 + 1, 15, nrow(df)) # 计算每组(15分钟)的均值,排除分组列 avg_df <- aggregate(. ~ group_id, data = df[, !colnames(df) %in% "group_id"], mean) # 可选:用每组的第一个时间戳作为该15分钟区间的标记 avg_df$interval_start <- df$record_time[seq(1, nrow(df), 15)] # 将当前文件的结果合并到州总结果中 state_results <- rbind(state_results, avg_df) } # 输出当前州的CSV文件,文件名以州名命名 output_path <- file.path(root_dir, paste0(state_name, "_15min_avg.csv")) write.csv(state_results, output_path, row.names = FALSE) # 打印进度提示 cat(sprintf("站点 %s 数据处理完成,文件已保存至:%s\n", state_name, output_path)) }
关键细节说明
- 注释行处理:代码默认过滤以
#开头的行,若你的注释行格式不同(比如以//开头),修改grepl("^#", raw_lines)中的匹配正则即可。 - 15行分组过滤:如果需要丢弃末尾不足15行的分组,可在聚合后添加:
# 只保留行数为15的分组 group_counts <- table(df$group_id) avg_df <- avg_df[group_counts[avg_df$group_id] == 15, ] - 输出路径调整:若想把CSV输出到对应州的文件夹内,修改
output_path为file.path(state_folder, paste0(state_name, "_15min_avg.csv"))即可。
内容的提问来源于stack exchange,提问作者Alexia k Boston
相关产品推荐
相关产品推荐

