R语言按年与分组计算组内相邻日期间隔天数异常排查
R dplyr按分组计算相邻日期间隔天数异常解决
问题原因
代码出现跨组计算、负间隔值,核心是操作顺序错误:
- 先在未分组状态做了全局排序,之后才做日期类型转换、分组操作,分组时会重置数据行顺序,导致之前排好的顺序被打乱
- 排序操作没有绑定分组边界,无法保证
lag()取到的永远是当前分组内的上一条日期 - 日期类型转换放在排序之后,若存在非标准格式日期,字符串排序会出现顺序错误
修正后可直接运行的代码
library(dplyr) data %>% # 先将字符串格式的日期转为正式Date类型,避免类型导致的排序/计算错误 mutate(date = as.Date(date)) %>% # 按年份、分组两个维度分组 group_by(year, group) %>% # 严格在分组内部按日期升序排列,.by_group = TRUE保证不打破分组边界 arrange(date, .by_group = TRUE) %>% # 计算日期间隔,Date对象直接相减默认单位为天,转成纯数值类型方便后续使用 mutate(Difference = as.numeric(date - lag(date))) %>% # 可选:完成分组计算后解除分组,避免后续操作受分组影响 ungroup()
运行结果说明
代码执行后会严格在每个(year, group)分组内计算间隔,不会出现跨组取值问题:
- 每个分组的第一条日期因为没有前序值,间隔为
NA - 2019年A组间隔依次为NA、10天、7天
- 2019年B组间隔依次为NA、15天
- 2020年A组间隔依次为NA、2天
- 2020年B组间隔依次为NA、19天、5天
额外提示
如果习惯用difftime函数,也可以把计算间隔的行替换为下面的写法,效果一致:
mutate(Difference = as.numeric(difftime(date, lag(date), units = "days")))
记得一定要用as.numeric()转换结果,否则返回的是带特殊属性的difftime对象,后续做数值运算可能出现意外问题。
内容的提问来源于stack exchange,提问作者novice_coder
相关产品推荐
相关产品推荐

