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

如何精简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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:48:27