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

如何用循环遍历数据框列表生成多维度五数汇总表?

问题背景与需求

现有数据集fulldata包含a、b、c三列,由df1(c=1)、df2(c=2)、df3(c=3)三个子集合并而成,生成代码如下:

df1 <- data.frame(
  a = rnorm(4, 10), b = rnorm(4, 6), c = 1
)

df2 <- data.frame(
  a = rnorm(6, 10), b = rnorm(6, 9), c = 2
)

df3 <- data.frame(
  a = rnorm(8, 8), b = rnorm(8, 9), c = 3
)

fulldata <- rbind(df1, df2)
fulldata <- rbind(fulldata, df3)

已定义向量c_values = c("df1", "df2", "df3")和columns = c("a", "b", "c"),需要实现:

  • 为每个子集的每一列生成包含min、Q1、中位数、Q3、max、均值的统计汇总表;
  • 汇总表需包含子集标识列(对应c值)和统计列标识;
  • 同时生成基于fulldata(不按c划分)的对应汇总;
  • 代码需适配子集和列数量更多的实际场景。
解决方案

1. 基础循环实现(通用适配多场景)

先将子集与名称关联,再通过双层循环逐个计算统计量,最后合并结果:

# 将子集存入列表,方便按名称调用
subset_list <- list(df1 = df1, df2 = df2, df3 = df3)
# 初始化空数据框存储结果
summary_result <- data.frame()

# 循环处理每个子集
for(sub_name in names(subset_list)){
  sub_data <- subset_list[[sub_name]]
  c_val <- unique(sub_data$c)
  # 循环处理当前子集的每一列
  for(col in columns){
    col_data <- sub_data[[col]]
    # 计算目标统计量
    stats_row <- data.frame(
      subset_id = sub_name,
      c_value = c_val,
      column = col,
      min = min(col_data),
      Q1 = quantile(col_data, 0.25),
      median = median(col_data),
      Q3 = quantile(col_data, 0.75),
      max = max(col_data),
      mean = mean(col_data)
    )
    # 合并到结果框
    summary_result <- rbind(summary_result, stats_row)
  }
}

# 处理全数据集fulldata
for(col in columns){
  col_data <- fulldata[[col]]
  stats_full <- data.frame(
    subset_id = "fulldata",
    c_value = NA,
    column = col,
    min = min(col_data),
    Q1 = quantile(col_data, 0.25),
    median = median(col_data),
    Q3 = quantile(col_data, 0.75),
    max = max(col_data),
    mean = mean(col_data)
  )
  summary_result <- rbind(summary_result, stats_full)
}

# 查看最终结果
print(summary_result)

2. 高效优化版(适配大数据量)

频繁使用rbind会降低效率,可提前预定义结果数据框结构,避免重复内存分配:

# 计算结果总行数:子集数×列数 + 全数据集列数
total_rows <- length(subset_list)*length(columns) + length(columns)
# 预定义结果数据框结构
summary_result <- data.frame(
  subset_id = character(total_rows),
  c_value = numeric(total_rows),
  column = character(total_rows),
  min = numeric(total_rows),
  Q1 = numeric(total_rows),
  median = numeric(total_rows),
  Q3 = numeric(total_rows),
  max = numeric(total_rows),
  mean = numeric(total_rows),
  stringsAsFactors = FALSE
)

row_idx <- 1
# 处理各子集
for(sub_name in names(subset_list)){
  sub_data <- subset_list[[sub_name]]
  c_val <- unique(sub_data$c)
  for(col in columns){
    col_data <- sub_data[[col]]
    summary_result[row_idx, ] <- list(
      subset_id = sub_name,
      c_value = c_val,
      column = col,
      min = min(col_data),
      Q1 = quantile(col_data, 0.25),
      median = median(col_data),
      Q3 = quantile(col_data, 0.75),
      max = max(col_data),
      mean = mean(col_data)
    )
    row_idx <- row_idx + 1
  }
}

# 处理全数据集
for(col in columns){
  col_data <- fulldata[[col]]
  summary_result[row_idx, ] <- list(
    subset_id = "fulldata",
    c_value = NA,
    column = col,
    min = min(col_data),
    Q1 = quantile(col_data, 0.25),
    median = median(col_data),
    Q3 = quantile(col_data, 0.75),
    max = max(col_data),
    mean = mean(col_data)
  )
  row_idx <- row_idx + 1
}

关键说明

  • 用列表存储子集可直接通过名称调用,无需硬编码,适配任意数量的子集;
  • quantile(col_data, 0.25)和quantile(col_data, 0.75)直接计算Q1和Q3,符合统计定义;
  • 全数据集的c_value设为NA,明确标识无分组;
  • 预定义结果框的方式大幅提升大数据量下的运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:35:26