R语言中按站点分组选取非连续日期以最大化站点-日期组合
需求说明
为按站点(Site)分组的日期数据抽取尽可能多的非连续日期,最大化站点与日期的有效组合,具体规则:
- 单站点有4个及以上唯一日期时,抽取3个非连续日期
- 单站点仅存在1个唯一日期时,直接保留该日期
- 基于排序后日期的间隔筛选实现,避免相邻日期被同时选中
数据说明
输入数据集为uniqueSiteDate,包含两个核心字段:
Site:站点标识,文本类型Date:观测日期,Date类格式
数据集为站点-日期唯一对应结构,已按站点分组。
实现代码
首先加载依赖包:library(dplyr)
执行分组筛选逻辑:
selected_date_df <- uniqueSiteDate |> arrange(Site, Date) |> group_by(Site) |> reframe( valid_dates = unique(Date), selected_dates = { n <- length(valid_dates) if (n == 1) return(valid_dates) res <- valid_dates[1] for (d in valid_dates[-1]) { if (length(res) >= 3) break if (d - tail(res, 1) > 1) res <- c(res, d) } res } ) |> unnest(selected_dates) |> select(Site, Date = selected_dates)
效果验证
以站点HP37P1B为例,其原始4个唯一日期按升序排序为2020-03-07、2020-03-12、2020-03-13、2020-03-14:
- 先选中第一个日期
2020-03-07 - 下一个日期
2020-03-12与上一个选中日期相差5天,非连续,加入选中集,当前选中数为2 - 下一个日期
2020-03-13与上一个选中的2020-03-12相差1天,连续,跳过 - 下一个日期
2020-03-14与上一个选中的2020-03-12相差2天,非连续,加入选中集,当前选中数达3,停止遍历
最终输出该站点的3个非连续日期:2020-03-07、2020-03-12、2020-03-14,符合预期要求。
内容的提问来源于stack exchange,提问作者Vijay Ramesh
相关产品推荐
相关产品推荐

