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

R语言分组提取日期列最小/最大值结果异常问题

异常原因

核心问题是Date.received列存储为因子(factor)类型,而非标准日期类型:

  • slice_min()、slice_max()对因子值排序时,默认按照因子的内部水平编码数值升序排列,不会按照日期实际的时间先后逻辑判断大小。
  • 从测试数据的结构可以看到,Date.received的因子水平中,"01/02/2024"对应的内部编码为1,"05/01/2022"对应的内部编码为2,因此函数会误将编码更小的2024年日期判定为最小值,编码更大的2022年日期判定为最大值,和真实时间顺序完全相反。
  • 其余分组结果正常属于巧合:这几个分组下的因子内部编码大小刚好和真实日期的先后顺序匹配,因此没有返回错误结果。
修正方案

必须先将日期列从因子转换为R可识别的标准日期类型,再执行分组提取操作。注意原始日期为日/月/年格式,转换时需要指定正确的解析规则,避免解析错误。

方案1:保留原有slice函数逻辑

library(dplyr)
# 用lubridate包解析日期写法更简洁,也可使用基础R函数替代
library(lubridate)

# 提取每组最早日期
R_Date.Test %>% 
  mutate(Date.received = dmy(Date.received)) %>%
  group_by(PR.Number) %>% 
  slice_min(Date.received)

# 提取每组最晚日期
R_Date.Test %>% 
  mutate(Date.received = dmy(Date.received)) %>%
  group_by(PR.Number) %>% 
  slice_max(Date.received)

如果不想加载额外包,也可以用基础R的日期转换函数替换dmy():

mutate(Date.received = as.Date(Date.received, format = "%d/%m/%Y"))

方案2:一次性聚合输出每组的最早、最晚日期

用summarise()直接聚合,不需要两次切片操作,输出结果更规整:

R_Date.Test %>%
  mutate(Date.received = dmy(Date.received)) %>%
  group_by(PR.Number) %>%
  summarise(
    min_date = min(Date.received),
    max_date = max(Date.received),
    .groups = "drop"
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:15:35