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

在R中高效读取大型患者数据文件并按MRN列表筛选的方法

解决方案

一、正确读取指定列的方法

你之前的代码报错是因为lapply用法错误——直接调用fread(select=...)时未传入file参数,导致fread找不到输入文件。正确写法是在lapply中使用匿名函数,将每个文件名传递给fread的file参数,同时指定要保留的列:

# 定义需要保留的列
keep_cols <- c("PAT_MRN_ID", "LAB_RSLT_COLLECTION_DTTM", "LAB_TEST", "LAB_RSLT_VALUE", "ORDERING_DATE")

# 批量读取指定列并合并
lab_dt <- rbindlist(
  lapply(list_lab, function(file_path) {
    fread(file = file_path, select = keep_cols, fill = TRUE)
  }),
  fill = TRUE
)

这个写法会逐个读取list_lab中的文件,仅加载你需要的5列,大幅降低内存占用,避免之前的内存耗尽问题。

二、边读取边筛选更高效

是的,边读取边筛选(读一个文件就过滤一次PAT_MRN_ID)比先全量读取再筛选更高效,尤其是目标MRN仅占总数据很小比例时。这种方式能进一步压缩内存占用,不用保留所有符合列要求的数据,只留存目标MRN的记录:

keep_cols <- c("PAT_MRN_ID", "LAB_RSLT_COLLECTION_DTTM", "LAB_TEST", "LAB_RSLT_VALUE", "ORDERING_DATE")
target_mrn <- list_MRN  # 你的125个目标MRN列表

# 边读边筛选再合并
lab_dt <- rbindlist(
  lapply(list_lab, function(file_path) {
    # 读取指定列
    temp_dt <- fread(file = file_path, select = keep_cols, fill = TRUE)
    # 筛选目标MRN
    temp_dt[PAT_MRN_ID %in% target_mrn]
  }),
  fill = TRUE
)

额外优化建议

如果PAT_MRN_ID是字符类型,可先将target_mrn转为data.table并设置键,用键连接的方式筛选,速度会更快:

target_mrn_dt <- data.table(PAT_MRN_ID = target_mrn, key = "PAT_MRN_ID")

lab_dt <- rbindlist(
  lapply(list_lab, function(file_path) {
    temp_dt <- fread(file = file_path, select = keep_cols, fill = TRUE)
    setkey(temp_dt, PAT_MRN_ID)
    # 键连接筛选
    temp_dt[target_mrn_dt, nomatch = 0]
  }),
  fill = TRUE
)

内容的提问来源于stack exchange,提问作者slwt86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:50:04