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

如何在R中循环读取多CSV文件并批量计算统计特征?

批量处理CSV数据集统计特征的R语言实现

需求说明

处理多个包含参数A、B、C、D、E的CSV数据集,为每个数据集的指定变量计算最小值、四分位数、中位数、最大值、均值、标准差等统计特征,并整理为规范表格,用于后续绘图与统计分析。已实现单数据框的统计计算,但需批量处理所有读取的数据集,避免重复代码。

示例数据

Date       A        B              C              D                  E
1      44837.88   11.81    -0.71          0.02           0.03               1453.52
2      44837.88   10.90    -0.71          0.01           0.01               1450.04
3      44837.88   10.22    -0.78          0.02           0.03               1447.37
4      44837.88    9.59    -0.78          0.02           0.03               1444.87
5      44837.88    8.95    -0.85          0.01           0.01               1442.30

现有代码

读取CSV文件(生成独立数据框)

for(i in 1:length(data_files)) {                               
  assign(paste0("data", i),                                  
         read.csv2(paste0("D:\\My\\data\\pathway\\",
                          data_files[i])))
}

单个数据框统计计算

df.sum <- data1 %>%
  select(Temp.C., Depth.m., Salinity.psu., Conduct.mS.cm., Sound.Velocity.m.sec.) %>% # 选择需统计的变量
  summarise_each(funs(min = min, 
                      q25 = quantile(., 0.25), 
                      median = median, 
                      q75 = quantile(., 0.75), 
                      max = max,
                      mean = mean, 
                      sd = sd))

library(tidyr) # 转换表格格式
df.stats.tidy <- df.sum %>% gather(stat, val) %>%
  separate(stat, into = c("var", "stat"), sep = "_") %>%
  spread(stat, val) %>%
  select(var, min, q25, median, q75, max, mean, sd) 

批量处理改造方案

1. 优化数据读取:用列表存储所有数据集

替代assign生成独立数据框的方式,将所有数据存入列表,更便于批量操作:

# 加载工具包(用于处理文件名)
library(tools)

# 读取所有CSV到列表
data_list <- lapply(data_files, function(file) {
  read.csv2(paste0("D:\\My\\data\\pathway\\", file))
})

# 给列表元素命名(用文件名作为标识,方便后续区分)
names(data_list) <- file_path_sans_ext(data_files)

2. 封装统计计算为函数

将单个数据框的统计逻辑封装成函数,提高复用性:

# 加载所需包
library(dplyr)
library(tidyr)

calc_dataset_stats <- function(df, target_vars = c("A", "B", "C", "D", "E")) {
  df %>%
    # 选择需要计算统计量的变量
    select(all_of(target_vars)) %>%
    # 为每个变量计算指定统计量(用across替代已弃用的summarise_each)
    summarise(across(everything(), list(
      min = ~min(., na.rm = TRUE),
      q25 = ~quantile(., 0.25, na.rm = TRUE),
      median = ~median(., na.rm = TRUE),
      q75 = ~quantile(., 0.75, na.rm = TRUE),
      max = ~max(., na.rm = TRUE),
      mean = ~mean(., na.rm = TRUE),
      sd = ~sd(., na.rm = TRUE)
    ))) %>%
    # 整理为长格式
    pivot_longer(everything(), names_to = c("var", "stat"), names_sep = "_") %>%
    # 转换为规范宽格式
    pivot_wider(names_from = stat, values_from = value) %>%
    # 指定列顺序
    select(var, min, q25, median, q75, max, mean, sd)
}

3. 批量处理所有数据集

用lapply循环处理列表中的每个数据框,或合并为总表:

# 批量计算每个数据集的统计结果,存储为列表(每个元素对应一个数据集的统计表格)
all_dataset_stats <- lapply(data_list, calc_dataset_stats)

# (可选)将所有结果合并为一个总表,添加数据集标识列
library(purrr)
combined_stats_table <- imap_dfr(all_dataset_stats, ~mutate(.x, dataset = .y))

关键说明

  • 用列表存储数据:避免生成大量独立数据框,简化批量操作逻辑,代码更整洁。
  • across语法:替代已弃用的summarise_each,是dplyr的推荐用法,更灵活。
  • na.rm = TRUE:避免因缺失值导致统计量计算失败,可根据实际数据情况调整。
  • 合并总表:imap_dfr自动将列表元素和名称对应,添加数据集标识,方便后续跨数据集对比分析或绘图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:50:27