在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
相关产品推荐
相关产品推荐

