如何从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
相关产品推荐
相关产品推荐

