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

