R导入多来源患者CSV文件 匹配添加对应patient_id的实现问题
问题根因
你当前的代码存在三个核心问题:
- 自定义的
read_in函数中使用了未定义的变量id,同时设置了默认patient_id = 1,导致所有读取的数据都默认填充了id为1 - 未建立CSV文件名和
patient_names表中患者id的映射关系,调用map_df时仅传入了文件路径,函数无法匹配每个文件对应的患者id - 函数直接调用全局环境的
patient_names对象,存在作用域风险
实现方案
步骤1:加载依赖包
library(tidyverse)
步骤2:生成文件路径与患者id的映射关系
# 读取目录下所有csv文件的全路径 file_paths <- list.files(path = "/directory", pattern = "\\.csv$", full.names = TRUE) # 提取不带路径和后缀的文件名核心(如LebronJames.csv提取为LebronJames) file_core_names <- str_remove(basename(file_paths), "\\.csv$") # 处理患者映射表,生成无空格的姓名键用于匹配文件名 patient_names <- patient_names %>% mutate(name_key = str_remove_all(patient_name, "\\s")) # 为每个文件匹配对应的patient_id matched_patient_ids <- map_int(file_core_names, ~patient_names$patient_id[patient_names$name_key == .x])
步骤3:重写读取函数
read_in <- function(path, patient_id){ data <- read_delim(path, delim = ";", col_names = TRUE) # 将对应patient_id插入到第一列 data <- add_column(data, patient_id = patient_id, .before = 1) return(data) }
步骤4:迭代读取并合并所有数据
final_merged_data <- map2_df(.x = file_paths, .y = matched_patient_ids, .f = read_in)
运行后得到的final_merged_data就是包含所有患者数据和对应patient_id的合并数据框。
内容的提问来源于stack exchange,提问作者user879156
相关产品推荐
相关产品推荐

