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

如何提取DataFrame中每日/每月变量极值对应的完整行数据

解决方法:保留原数据提取极值对应的完整行

我完全懂你的困扰——用aggregate确实只能拿到极值的数值,没法保留原DataFrame里的其他关键信息。下面给你两种实用的方案,不管用基础R还是tidyverse工具都能轻松实现,就用你提到的「提取每月温度极值对应完整行」的例子来演示:

方法一:基础R实现(无需额外包)

利用ave()函数可以按分组生成和原数据长度一致的极值向量,这样就能直接用来筛选行:

# 假设你的数据框df包含:日期列Date、温度列Temp,以及其他需要保留的列
# 第一步:生成月份分组列(按年-月分组,避免跨年同月份混淆)
df$month <- format(df$Date, "%Y-%m")

# 第二步:为每一行标记其所在月份的温度极值
df$month_max_temp <- ave(df$Temp, df$month, FUN = max)
df$month_min_temp <- ave(df$Temp, df$month, FUN = min)

# 第三步:筛选出温度等于当月最大值或最小值的所有行
extreme_subset <- df[df$Temp == df$month_max_temp | df$Temp == df$month_min_temp, ]

# 可选:删除临时生成的极值标记列
extreme_subset <- extreme_subset[, !names(extreme_subset) %in% c("month_max_temp", "month_min_temp")]

方法二:tidyverse/dplyr实现(更简洁)

如果习惯用tidyverse的语法,这个方案会更直观,代码可读性也更高:

library(dplyr)
library(lubridate) # 用来方便处理日期

extreme_subset <- df %>%
  # 生成月份分组(floor_date会把日期统一到当月第一天,确保分组准确)
  mutate(month = floor_date(Date, "month")) %>%
  # 按月份分组
  group_by(month) %>%
  # 筛选出温度等于组内最大值或最小值的行
  filter(Temp == max(Temp) | Temp == min(Temp)) %>%
  # 取消分组(后续操作更方便)
  ungroup()

针对你实际需求的调整

如果你是处理分钟级数据提取每日极值,只需要把分组逻辑从「月份」改成「日期」就行:

  • 基础R里把format(df$Date, "%Y-%m")改成format(df$Datetime, "%Y-%m-%d")
  • tidyverse里把floor_date(Date, "month")改成floor_date(Datetime, "day")

另外要注意:如果同一分组内(比如同一天/月)有多个时刻的温度都等于极值,这两种方法都会保留所有符合条件的行,完全保留原数据的所有列信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:22