在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
相关产品推荐
相关产品推荐

