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

在R中批量导入CSV文件并为除主键外的列名添加对应文件后缀

解决方案

R语言实现(优先)

直接将文件读取和列名重命名合并为一步操作,同时保证文件名和数据集一一对应,避免错配:

library(readr)
# 读取路径配置
file_full_paths <- list.files(path = "data", full.names = TRUE)
file_simple_names <- sub("\\.csv$", "", list.files(path = "data"))

# 双参数遍历实现读文件+加后缀
datasets <- Map(function(cur_path, cur_name) {
  # 读取当前CSV
  cur_df <- read_csv(cur_path, show_col_types = FALSE)
  # 除主键外所有列加文件名后缀,该写法不依赖subject_id的列位置,更鲁棒
  rename_cols <- colnames(cur_df) != "subject_id"
  colnames(cur_df)[rename_cols] <- paste0(colnames(cur_df)[rename_cols], "_", cur_name)
  return(cur_df)
}, file_full_paths, file_simple_names)

如果需要将所有处理后的数据集按subject_id合并为一个宽表,可以追加以下代码:

library(purrr)
library(dplyr)
full_wide_df <- reduce(datasets, left_join, by = "subject_id")

你原有代码的问题:

  • 没有将数据集和文件名做一一对应,每个数据集都遍历了所有文件名,会导致后缀被重复追加
  • 嵌套在lapply内的for循环没有正确return df对象,导致最终输出为NULL

Python实现

import os
import pandas as pd
from functools import reduce

data_dir = "./data"
# 筛选目录下所有CSV文件
csv_files = [f for f in os.listdir(data_dir) if f.endswith(".csv")]
processed_dfs = []

for file in csv_files:
    # 提取无后缀的文件名
    file_name = file.rsplit(".", 1)[0]
    # 读取文件
    df = pd.read_csv(os.path.join(data_dir, file))
    # 重命名非主键列
    df = df.rename(columns=lambda col: f"{col}_{file_name}" if col != "subject_id" else col)
    processed_dfs.append(df)

# 合并为总宽表
full_wide_df = reduce(lambda left, right: pd.merge(left, right, on="subject_id"), processed_dfs)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:09:05