如何在dplyr分组汇总中提取污染浓度最值对应的日期
问题描述
我正尝试按站点ID创建包含年度平均污染浓度的元数据文件,能轻松计算均值、最大值、最小值等统计量,但无法从源数据集中提取污染浓度最值对应的日期,并将其作为新列添加到汇总后的数据集里。
源数据集示例
| ID | Conc | Date |
|---|---|---|
| 1 | 3000 | 01-04-2022 |
| 1 | 3256 | 01-05-2022 |
| 1 | 6352 | 02-09-2022 |
| 1 | 7362 | 03-04-2022 |
| 2 | 5364 | 01-04-2022 |
| 2 | 6453 | 01-05-2022 |
| 2 | 3490 | 02-09-2022 |
期望输出汇总表
| ID | Min | Max | min_date | max_date |
|---|---|---|---|---|
| 1 | 3000 | 7362 | 01-04-2022 | 03-04-2022 |
| 2 | 3490 | 6453 | 02-09-2022 | 01-05-2022 |
| 3 | 900 | 37267 | 01-05-2022 | 08-09-2022 |
| 4 | 3490 | 5666 | 02-09-2022 | 07-01-2022 |
现有代码
我目前无法获取最值对应的日期,现有用于计算其他统计量的dplyr代码如下:
annual_table <- all %>% group_by(NEAR_FID) %>% dplyr::summarize( avg = mean(Conc, na.rm = T), n_data_points = length(NEAR_FID), median = median(Conc), quant_95 = quantile(Conc,0.5), quant_5 = quantile(Conc,0.95), max = max(Conc), min = min(Conc))
我尝试过多种索引方法但效果不佳,希望能在现有代码中添加dplyr实现方案,而非使用过滤和连接的复杂workaround,请问有什么解决思路?
解决方案
可以直接在dplyr::summarize()里通过位置索引定位最值对应的日期,核心是用which.min()/which.max()获取浓度最值的位置,再提取对应日期。如果存在多个日期对应同一最值的情况,可按需选择取第一个或最后一个匹配日期。
修改后的代码如下:
annual_table <- all %>% group_by(NEAR_FID) %>% dplyr::summarize( avg = mean(Conc, na.rm = TRUE), n_data_points = n(), # 用n()替代length(NEAR_FID)更简洁高效 median = median(Conc, na.rm = TRUE), quant_95 = quantile(Conc, 0.95, na.rm = TRUE), # 修正分位数参数,原代码参数写反 quant_5 = quantile(Conc, 0.05, na.rm = TRUE), # 修正分位数参数 max = max(Conc, na.rm = TRUE), min = min(Conc, na.rm = TRUE), max_date = Date[which.max(Conc)], min_date = Date[which.min(Conc)] # 若需处理重复最值,可改为:max_date = first(Date[which.max(Conc)]) )
关键说明
which.min()/which.max():返回向量中最值的位置索引,用该索引直接提取对应Date值即可。- 重复最值处理:如果同一站点有多个日期浓度等于最值,
Date[which.min(Conc)]会返回多个日期,此时可使用first()/last()指定取第一个或最后一个匹配日期。 - 缺失值处理:所有统计函数统一添加
na.rm = TRUE,避免因缺失值导致计算结果为NA。 - 分位数参数修正:原代码中
quant_95和quant_5的参数写反,已修正为对应分位数的正确参数(95分位数用0.95,5分位数用0.05)。
内容的提问来源于stack exchange,提问作者bre123
相关产品推荐
相关产品推荐

