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

如何用tidyverse高效合并含冗余列的多个CSV文件?

基于tidyverse的多CSV文件整合最优方案

场景说明

现有多个结构一致的CSV文件:每个文件包含id列和若干特征列(如a、b、c),但仅某一个特征列有有效值,其余非id列均为0。例如a.csv的a列是有效值,b、c列全为0;b.csv的b列是有效值,a、c列全为0,以此类推。需要将这些文件整合为一个完整的DataFrame,每个id对应各特征列的有效值。

最优实现方法

1. 加载核心包

首先加载tidyverse套件,它包含了文件读取、数据处理的核心工具:

library(tidyverse)

2. 获取目标文件路径

批量获取当前目录下所有目标CSV文件的完整路径(可根据实际存储路径调整):

csv_files <- list.files(pattern = "\\.csv$", full.names = TRUE)

3. 方案一:全列读取后聚合(适合列数较少的场景)

直接批量读取所有文件并绑定为一个大DataFrame,随后按id分组,对每个特征列取最大值(或求和,因无效值为0,结果完全一致):

# 批量读取并绑定所有文件
combined_data <- map_dfr(csv_files, read_csv)

# 按id分组聚合,提取各列有效值
final_df <- combined_data %>%
  group_by(id) %>%
  summarise(across(c(a, b, c), max), .groups = "drop")

4. 方案二:仅读取必要列后聚合(适合列数/文件数极多的场景)

如果文件包含大量无关列,可仅读取id和对应有效列,大幅减少内存占用:

# 定义函数:从文件名提取目标列名
get_target_col <- function(file_path) {
  str_remove(basename(file_path), "\\.csv$")
}

# 批量读取并仅保留id和目标列
combined_data <- map_dfr(csv_files, function(file) {
  target_col <- get_target_col(file)
  read_csv(file) %>%
    select(id, all_of(target_col))
})

# 按id分组聚合,提取各列有效值
final_df <- combined_data %>%
  group_by(id) %>%
  summarise(across(everything(), ~ max(.x, na.rm = TRUE)), .groups = "drop")

方案优势

  • 高效批量处理:用map_dfr替代循环读取,大幅提升文件处理速度,适配大量文件场景。
  • 简洁列操作:across函数批量处理特征列,避免重复代码,列数越多优势越明显。
  • 低内存占用:方案二仅读取必要列,在列数极多时能显著降低内存消耗。
  • 稳定聚合逻辑:通过分组取最大值/求和,确保每个id对应各列的唯一有效值,逻辑简单可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:35:29