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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:12:42