如何使用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) )
解决方案
通过以下步骤实现需求:
- 按
date分组,为每组内的行添加组内序号; - 提取每个日期的首次出现记录,计算其与前一个日期的天数差;
- 将天数差信息关联回原数据,结合组内序号生成
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
相关产品推荐
相关产品推荐

