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

在R中将多份CSV文件合并为单一DataFrame的技术求助

合并多CSV文件并按ID重塑心血管与HIV研究数据

我完全理解你处理这类多文件研究数据时的困扰——93个CSV文件要按ID合并并重塑结构确实有点棘手。下面是一套针对你需求的完整解决方案,用tidyverse工具链就能高效完成:

步骤1:加载所需工具包

我们会用到tidyverse里的dplyr(数据操作)、purrr(循环处理)和readr(快速读取CSV):

library(tidyverse)

步骤2:读取文件路径与文件名

沿用你已经写好的代码,获取所有文件的完整路径和对应的测量名称:

files.measurements <- as.character(list.files(path = "~/measurements/", full.names = TRUE))
measurements.filenames <- gsub(".csv", "", basename(files.measurements))

步骤3:定义单个文件处理函数

这个函数会读取每个CSV,保留id, name, sex, dob这些基础列,并将measurement列重命名为对应的文件名:

process_single_file <- function(file_path, measurement_col_name) {
  # 读取CSV文件(如果你的CSV有特殊分隔符,可添加delim参数调整)
  raw_df <- read_csv(file_path)
  
  # 筛选必要列并重命名measurement为对应文件名
  raw_df %>%
    select(id, name, sex, dob, measurement) %>%
    rename(!!measurement_col_name := measurement) # !!用于将变量值作为列名
}

步骤4:批量处理所有文件

用map2函数将文件路径和测量名称一一对应,批量处理得到数据框列表:

processed_dfs <- map2(files.measurements, measurements.filenames, process_single_file)

步骤5:全连接合并所有数据框

用reduce结合full_join,按id, name, sex, dob进行全连接——这样所有出现过的ID都会被保留,缺失的测量值自动填充为NA(即你需要的留空效果):

final_combined_df <- processed_dfs %>%
  reduce(full_join, by = c("id", "name", "sex", "dob"))

关键补充说明

  • 全连接(full_join)会完整保留所有文件中的ID:不管某个ID出现在1个还是多个文件里,都会生成对应的行;只在少数文件里出现的ID,未涉及的测量列会显示NA。
  • 如果同一个ID对应的基础列(name, sex, dob)在不同文件中有不一致的情况,full_join会保留所有冲突的行。你可以提前检查这类数据问题:
    # 检查同一ID下基础列是否存在冲突
    final_combined_df %>%
      group_by(id) %>%
      filter(n_distinct(name) > 1 | n_distinct(sex) > 1 | n_distinct(dob) > 1)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:07:57