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

如何从DataFrame对应月份行提取温度列的均值/最值/中位数并批量汇总?

批量处理物种温度观测数据并汇总统计结果

问题背景

我有80个对应不同物种的温度观测数据文件,每个文件的DataFrame结构示例如下:

dput(head(BIRD_NAME, 10))
structure(list(x = c(-4.752939, 1.129787, 51.918896, 21.512894, 
-9.319702, -0.046992, 6.38507, -7.441907, 33.9505, -3.165023), 
    y = c(42.067673, 52.03018, 47.105537, 61.84814, 38.7668, 
    51.59226, 53.170395, 37.208645, 36.302677, 40.64759), Feb = c(5.80000019073486, 
    3.90000009536743, -7.30000019073486, -6.09999990463257, 12.1000003814697, 
    4.80000019073486, 2.20000004768372, 12.5, 11.3000001907349, 
    6.40000009536743), Mar = c(8.19999980926514, 6, 0.100000001490116, 
    -2.5, 13.6000003814697, 6.90000009536743, 4.90000009536743, 
    14.1000003814697, 13.8999996185303, 9), Apr = c(9.80000019073486, 
    7.90000009536743, 11.8000001907349, 2.40000009536743, 14.5, 
    8.80000019073486, 7.5, 15.6000003814697, 17.6000003814697, 
    11), May = c(13.3999996185303, 11.5, 18.8999996185303, 8.30000019073486, 
    16.6000003814697, 12.5, 11.8000001907349, 18.2999992370605, 
    21.2999992370605, 14.8000001907349), Jun = c(17.7999992370605, 
    14.5, 24.3999996185303, 13.1999998092651, 19.2000007629395, 
    15.6000003814697, 14.5, 22, 24.7999992370605, 19.7999992370605
    ), Sep = c(17.7999992370605, 14.3999996185303, 17.7999992370605, 
    10.1999998092651, 20.3999996185303, 14.8000001907349, 13.6000003814697, 
    22.8999996185303, 25.7999992370605, 19.6000003814697), MONTH = structure(c(3L, 
    4L, 4L, 5L, 4L, 4L, 5L, 3L, 4L, 5L), levels = c("2", "3", 
    "4", "5", "6", "9"), class = "factor"), DATE = structure(c(3L, 
    4L, 4L, 5L, 4L, 4L, 5L, 3L, 4L, 5L), levels = c("2", "3", 
    "4", "5", "6", "9"), class = "factor")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

其中MONTH列为因子类型,编码与月份的对应关系:2→Feb、3→Mar、4→Apr、9→Sep;以月份命名的列是对应站点的温度值。

需求

  • 对每个月份温度列(Feb、Mar、Apr、Sep),仅筛选出MONTH列对应编码的行;
  • 计算该子集的均值(mean)、最大值(max)、最小值(min)、中位数(median);
  • 将所有文件的统计结果汇总到结构如下的新DataFrame中,首列为原文件名:
TEMP_MAXMINMEDMEAN = data.frame(filename = character(),
                     feb_max = numeric(), feb_min = numeric(),feb_med =numeric(),feb_mean = numeric(),
                   mar_max = numeric(),mar_min = numeric(),mar_med =numeric(), mar_mean = numeric(),
                   apr_max = numeric(), apr_min = numeric(),apr_med =numeric(),apr_mean = numeric(), 
                    sept_max = numeric(),sept_min = numeric(),sept_med =numeric(),sept_mean = numeric()) 

解决方案(R语言实现)

步骤1:定义月份映射与处理函数

首先定义月份编码和列名的对应关系,然后编写处理单个文件的函数,完成筛选和统计计算:

# 定义月份编码与列名的映射
month_mapping <- list(
  "2" = list(col = "Feb", prefix = "feb"),
  "3" = list(col = "Mar", prefix = "mar"),
  "9" = list(col = "Sep", prefix = "sept"),
  "4" = list(col = "Apr", prefix = "apr")
)

# 处理单个文件的函数
process_single_file <- function(file_path) {
  # 读取文件(假设是csv格式,若为其他格式请调整read函数)
  df <- read.csv(file_path, stringsAsFactors = FALSE)
  # 转换MONTH为字符型,避免因子编码问题
  df$MONTH <- as.character(df$MONTH)
  
  stats_list <- list(filename = basename(file_path))
  
  # 遍历每个月份映射,计算统计量
  for (code in names(month_mapping)) {
    info <- month_mapping[[code]]
    # 筛选对应MONTH编码的行
    subset_data <- df[df$MONTH == code, info$col]
    # 计算统计量,排除NA值
    stats_list[[paste0(info$prefix, "_max")]] <- max(subset_data, na.rm = TRUE)
    stats_list[[paste0(info$prefix, "_min")]] <- min(subset_data, na.rm = TRUE)
    stats_list[[paste0(info$prefix, "_med")]] <- median(subset_data, na.rm = TRUE)
    stats_list[[paste0(info$prefix, "_mean")]] <- mean(subset_data, na.rm = TRUE)
  }
  
  # 转换为数据框行
  as.data.frame(stats_list)
}

步骤2:批量处理所有文件

指定文件所在目录,获取所有目标文件路径,批量处理并合并结果:

# 设置文件所在目录(替换为你的实际路径)
data_dir <- "./your_data_directory/"
# 获取所有数据文件(假设是csv,若为其他格式请调整后缀)
file_paths <- list.files(data_dir, pattern = "\\.csv$", full.names = TRUE)

# 批量处理所有文件
all_stats <- do.call(rbind, lapply(file_paths, process_single_file))

# 匹配目标DataFrame的列顺序(可选,确保列顺序一致)
target_cols <- colnames(TEMP_MAXMINMEDMEAN)
all_stats <- all_stats[, target_cols]

# 可选:将结果保存为csv
write.csv(all_stats, "./temperature_summary.csv", row.names = FALSE)

说明

  • 如果你的数据文件不是csv格式(比如RData),请将read.csv替换为对应的读取函数(如readRDS);
  • 代码中加入了na.rm = TRUE来处理缺失值,若不需要可根据实际情况删除;
  • 运行前请将data_dir替换为你的实际数据文件所在目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:40:07