如何在R读取多文件夹TXT数据时添加列条件清洗逻辑?
修改后的data.table递归读取与数据清洗代码
以下是满足需求的完整R代码,基于data.table实现递归读取、注释行跳过、列名整理及条件清洗:
library(data.table) # 递归获取D:/Test2下所有TXT文件路径 file_paths <- list.files(path = "D:/Test2", pattern = "\\.txt$", full.names = TRUE, recursive = TRUE) # 定义单文件处理函数 process_file <- function(file_path) { # 读取文件,跳过以#开头的注释行 dt <- fread(file_path, comment.char = "#", stringsAsFactors = FALSE) # 整理列名:去除首尾空格并转为小写(可根据实际需求调整) setnames(dt, tolower(trimws(names(dt)))) # 应用清洗规则:仅当对应列存在时执行 # 规则1:C1c≠0时将C1设为NA if ("c1c" %in% names(dt) && "c1" %in% names(dt)) { dt[c1c != 0, c1 := NA] } # 规则2:C1不在[-400,350]范围时设为NA if ("c1" %in% names(dt)) { dt[!between(c1, -400, 350), c1 := NA] } # 规则3:C2c≠0时将C2设为NA if ("c2c" %in% names(dt) && "c2" %in% names(dt)) { dt[c2c != 0, c2 := NA] } # 规则4:C2不在[-250,450]范围时设为NA if ("c2" %in% names(dt)) { dt[!between(c2, -250, 450), c2 := NA] } # 规则5:C3c≠0时将C3设为NA if ("c3c" %in% names(dt) && "c3" %in% names(dt)) { dt[c3c != 0, c3 := NA] } # 规则6:C3不在[100,500]范围时设为NA if ("c3" %in% names(dt)) { dt[!between(c3, 100, 500), c3 := NA] } # 规则7:K<90时设为NA if ("k" %in% names(dt)) { dt[k < 90, k := NA] } # 规则8:PP<200时设为NA if ("pp" %in% names(dt)) { dt[pp < 200, pp := NA] } # 添加来源文件名(可选,用于追踪数据来源) dt[, source_file := basename(file_path)] return(dt) } # 批量处理所有文件并合并结果 combined_dt <- rbindlist(lapply(file_paths, process_file), fill = TRUE)
核心细节说明
- 列名兼容处理:通过
tolower(trimws(names(dt)))统一列名格式,避免因大小写、首尾空格导致的列匹配失败,可根据实际文件的列名格式调整此步骤。 - 安全的条件判断:每个清洗规则前都会检查目标列是否存在,确保文件缺少某列时不会触发报错。
- 高效原地修改:使用data.table的
dt[条件, 列 := 值]语法实现原地数据修改,在处理大文件时比传统data.frame操作更高效。 - 灵活合并:
rbindlist的fill = TRUE参数支持不同列数的文件合并,缺失列自动填充NA。
内容的提问来源于stack exchange,提问作者Alexia k Boston
相关产品推荐
相关产品推荐

