如何精简R语言代码:CSV读取、数据合并与随访率计算
R代码精简优化方案:批量处理CSV文件夹并统计随访数据
核心需求回顾
- 从
as1至as9共9个文件夹读取所有.csv文件 - 每个文件夹内文件转为列表,并重命名列表元素(移除
.csv后缀) - 合并单个文件夹内所有数据为DataFrame,其中
as1-as3含AS{n}_AREA列,as4-as9含AS{n}_DATA_CLASS列 - 合并9个文件夹的DataFrame为总表
- 统计随访RID、失访RID及随访率
精简优化后的代码
library(tidyverse) # 定义目标文件夹列表 folders <- str_c("as", 1:9) # 封装单文件夹处理逻辑:读取→重命名→合并 process_single_folder <- function(folder_name) { # 获取文件夹内所有CSV文件的完整路径 csv_files <- list.files(folder_name, pattern = "\\.csv$", full.names = TRUE) # 批量读取CSV为列表 csv_list <- map(csv_files, read_csv) # 重命名列表元素:仅保留文件名(移除路径和.csv后缀) names(csv_list) <- csv_files %>% basename() %>% str_remove("\\.csv$") # 合并列表为DataFrame,添加源文件和文件夹标识 bind_rows(csv_list, .id = "source_filename") %>% mutate(source_folder = folder_name) } # 批量处理所有文件夹并合并为总表 total_data <- map_dfr(folders, process_single_folder) # 动态匹配不同文件夹的专属分组列 total_data <- total_data %>% mutate( group_column = case_when( str_detect(source_folder, "^as[1-3]$") ~ pull(., str_c(source_folder, "_AREA")), str_detect(source_folder, "^as[4-9]$") ~ pull(., str_c(source_folder, "_DATA_CLASS")), TRUE ~ NA_character_ ) ) # 统计随访相关指标(假设RID为唯一标识,group_column非NA代表已随访) all_rid <- unique(total_data$RID) followed_rid <- total_data %>% filter(!is.na(group_column)) %>% pull(RID) %>% unique() lost_rid <- setdiff(all_rid, followed_rid) follow_up_rate <- length(followed_rid) / length(all_rid) # 输出统计结果 cat("随访RID数量:", length(followed_rid), "\n") cat("失访RID数量:", length(lost_rid), "\n") cat("随访率:", scales::percent(follow_up_rate), "\n")
关键优化说明
- 批量逻辑复用:通过
map系列函数替代重复的逐文件夹代码,新增/调整文件夹仅需修改folders列表 - 函数化封装:将单文件夹的读取、重命名、合并逻辑打包为独立函数,降低冗余且便于调试
- 动态字段适配:用
case_when结合字符串拼接,自动匹配不同文件夹的专属列,避免硬编码多个分支 - 可读性提升:全程使用
tidyverse生态工具,代码风格统一,附加源文件/文件夹标识便于溯源
内容的提问来源于stack exchange,提问作者HJ WHY
相关产品推荐
相关产品推荐

