在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
相关产品推荐
相关产品推荐

