使用R语言dplyr按连续日期生成From/To配对
解决方案:基于dplyr生成分组内的日期顺序配对
问题背景
现有包含分组标识Unit、编码Type及发生日期DATE的数据集,示例数据如下:
df <- tibble::tibble( Type = c( "H08", "C42", "J02", "H03", "D44", "D05", "D81", "Q11", "S02", "Q04", "H81", "D06", "F08", "E82", "D03", "Q82", "Q13", "S01", "E05", "E10", "H01", "E82", "E01" ), Unit = c( "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B" ), DATE = as.Date(c( "2015-08-20", "2015-10-06", "2015-10-26", "2015-11-13", "2016-03-26", "2016-06-03", "2016-06-13", "2016-09-22", "2017-03-16", "2017-06-15", "2018-08-29", "2018-08-31", "2018-10-09", "2020-04-20", "2020-05-06", "2020-05-06", "2020-05-06", "2020-08-19", "2016-11-03", "2016-11-03", "2017-05-05", "2017-05-08", "2020-05-06" )) )
需在每个Unit分组内按时间顺序生成From:To配对,满足两个规则:
- 常规连续日期场景:生成依次衔接的配对(如
A H08 C42、A C42 J02) - 同一日期存在多个
Type时:生成跨日期的全量配对(如2020年数据中A E82 D03、A E82 Q82等)
实现代码
使用dplyr管道的完整实现如下:
library(dplyr) library(tidyr) result <- df %>% # 按Unit和DATE分组,将同日期的Type打包为列表 group_by(Unit, DATE) %>% summarise(Type_list = list(Type), .groups = "drop_last") %>% # 按日期排序,保证时间顺序 arrange(DATE) %>% # 获取下一个日期组的Type列表 mutate(next_Type_list = lead(Type_list)) %>% # 过滤无后续组的行 filter(!is.na(next_Type_list)) %>% # 逐行生成当前组与下一组的全量交叉配对 rowwise() %>% reframe( From = rep(Type_list, each = length(next_Type_list)), To = rep(next_Type_list, length(Type_list)) ) %>% ungroup()
代码说明
- 分组打包同日期Type:将同一
Unit、同一DATE的所有Type存入列表,把同日期的多个Type视为一个整体组。 - 排序与匹配下一组:按
DATE排序确保时间顺序,用lead()获取当前组的下一个日期组的Type列表。 - 生成交叉配对:通过
rowwise()逐行处理,用reframe实现当前组每个Type与下一组每个Type的全量组合,自动生成符合要求的From:To配对。
结果验证
以Unit A的2020年相关配对为例:
result %>% filter(Unit == "A", From == "E82" | To == "S01")
输出结果与需求示例一致:
# A tibble: 6 × 3 Unit From To <chr> <chr> <chr> 1 A E82 D03 2 A E82 Q82 3 A E82 Q13 4 A D03 S01 5 A Q82 S01 6 A Q13 S01
内容的提问来源于stack exchange,提问作者PhDavey
相关产品推荐
相关产品推荐

