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

在R中提取地下水日最高/最低水位及对应时刻

解决每日地下水水位极值及对应时刻的问题

针对你的需求,推荐用dplyr包的分组聚合方法,既能高效计算每日极值,又能直接提取对应时刻,避免重复数据问题,以下是几种实用方案:

方案1:直接提取首个极值时刻(最常用)

用which.max()和which.min()定位每日最高/最低水位的首次出现位置,直接提取对应小时:

library(dplyr)

daily_result <- your_data %>%
  group_by(date) %>%
  summarise(
    max_level = max(level_m),
    max_hour = hour[which.max(level_m)],  # 提取首个最高水位的小时
    min_level = min(level_m),
    min_hour = hour[which.min(level_m)]   # 提取首个最低水位的小时
  ) %>%
  ungroup()  # 取消分组,恢复普通数据框格式

方案2:保留所有同值极值时刻(处理同日多时刻水位相同的情况)

如果同一天存在多个时刻水位同为最高/最低,可将对应小时存入列表:

daily_result_with_all_ties <- your_data %>%
  group_by(date) %>%
  summarise(
    max_level = max(level_m),
    max_hour = list(hour[level_m == max_level]),  # 所有最高水位的小时
    min_level = min(level_m),
    min_hour = list(hour[level_m == min_level])   # 所有最低水位的小时
  ) %>%
  ungroup()

后续若要展开列表格式的小时,可使用unnest()函数:

library(tidyr)
daily_result_with_all_ties %>% unnest(c(max_hour, min_hour))

方案3:用切片筛选极值行再合并

通过slice_max()/slice_min()筛选每日极值行,再合并结果:

# 提取每日最高水位数据
max_data <- your_data %>%
  group_by(date) %>%
  slice_max(level_m, n = 1, with_ties = FALSE) %>%  # with_ties=FALSE仅保留首个极值行
  select(date, max_level = level_m, max_hour = hour)

# 提取每日最低水位数据
min_data <- your_data %>%
  group_by(date) %>%
  slice_min(level_m, n = 1, with_ties = FALSE) %>%
  select(date, min_level = level_m, min_hour = hour)

# 合并结果
daily_result <- max_data %>% left_join(min_data, by = "date")

为什么你的之前方法有问题?

  • aggregate()仅返回聚合后的极值,无法关联原始行的小时信息;
  • left_join重复是因为未筛选出唯一的极值行,导致多行匹配,上述方案通过分组内定位极值位置或切片筛选,从根源避免了重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:20:24