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

如何在dplyr分组汇总中提取污染浓度最值对应的日期

问题描述

我正尝试按站点ID创建包含年度平均污染浓度的元数据文件,能轻松计算均值、最大值、最小值等统计量,但无法从源数据集中提取污染浓度最值对应的日期,并将其作为新列添加到汇总后的数据集里。

源数据集示例

IDConcDate
1300001-04-2022
1325601-05-2022
1635202-09-2022
1736203-04-2022
2536401-04-2022
2645301-05-2022
2349002-09-2022

期望输出汇总表

IDMinMaxmin_datemax_date
13000736201-04-202203-04-2022
23490645302-09-202201-05-2022
39003726701-05-202208-09-2022
43490566602-09-202207-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)])
   )

关键说明

  1. which.min()/which.max():返回向量中最值的位置索引,用该索引直接提取对应Date值即可。
  2. 重复最值处理:如果同一站点有多个日期浓度等于最值,Date[which.min(Conc)]会返回多个日期,此时可使用first()/last()指定取第一个或最后一个匹配日期。
  3. 缺失值处理:所有统计函数统一添加na.rm = TRUE,避免因缺失值导致计算结果为NA。
  4. 分位数参数修正:原代码中quant_95和quant_5的参数写反,已修正为对应分位数的正确参数(95分位数用0.95,5分位数用0.05)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:53