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

如何使用R的dplyr包根据日期差值生成0/1标记列?

问题描述

给定如下R数据框:

dt <-
  data.frame(
    date = c(as.Date("2022-03-01"), as.Date("2022-03-02"), as.Date("2022-03-08"), as.Date("2022-03-08"), as.Date("2022-04-01"), as.Date("2022-04-10"))
  )

需要使用dplyr包新增一列cache,赋值规则为:

  • 若当前日期与上一个不同日期的天数差值小于7天:该日期首次出现时赋值0,后续出现时赋值1;
  • 若天数差值大于等于7天:所有情况均赋值0;

期望得到的结果如下:

result <-
  data.frame(
    date = c(as.Date("2022-03-01"), as.Date("2022-03-02"), as.Date("2022-03-08"), as.Date("2022-03-08"), as.Date("2022-04-01"), as.Date("2022-04-10")),
    cache = c(0, 1, 0, 1, 0, 0)
  )
解决方案

通过以下步骤实现需求:

  1. 按date分组,为每组内的行添加组内序号;
  2. 提取每个日期的首次出现记录,计算其与前一个日期的天数差;
  3. 将天数差信息关联回原数据,结合组内序号生成cache列。

具体代码如下:

library(dplyr)

dt_result <- dt %>%
  # 按日期分组,添加组内行号
  group_by(date) %>%
  mutate(row_num = row_number()) %>%
  ungroup() %>%
  # 提取每个日期的首次记录,计算与前一个日期的天数差
  mutate(prev_distinct_date = lag(date[row_num == 1]),
         diff_days = as.numeric(date - prev_distinct_date)) %>%
  # 填充首次记录的差值(第一个日期无前置,设为NA)
  fill(diff_days, .direction = "down") %>%
  # 根据规则生成cache列
  mutate(cache = case_when(
    diff_days < 7 & row_num == 1 ~ 0,
    diff_days < 7 & row_num > 1 ~ 1,
    TRUE ~ 0
  )) %>%
  # 移除中间辅助列
  select(-row_num, -prev_distinct_date, -diff_days)

# 查看结果
dt_result

运行代码后得到的结果与期望一致:

# A tibble: 6 × 2
  date       cache
  <date>     <dbl>
1 2022-03-01     0
2 2022-03-02     1
3 2022-03-08     0
4 2022-03-08     1
5 2022-04-01     0
6 2022-04-10     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:27:35