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

R语言数据处理:统计当前日期两年内的NoShow次数

统计当前日期两年内的爽约次数

现有如下结构的DataFrame,已完成reNoShow_2y变量的创建,需要新增一个变量统计当前日期之后两年内的爽约次数,预期结果为[0,0,0,1,2,0,0,1,0](对应排序后的1-9行)。

示例数据

df <- data.frame(Person = c('334','334','334','334','334','334','334','334','334'), 
                 NoShow = c(1,1,1,0,1,1,0,1,0), 
                 date = c('2014-01-01','2016-06-01','2017-01-01','2018-05-01','2021-01-01','2021-06-03','2022-04-14','2022-04-14','2023-05-03'),
                 date_num = c(20140101, 20160601, 20170101, 20180501, 20210101, 20210603,20220414,20220414,20230503)
)

已完成的代码(创建reNoShow_2y)

df$date_num_rev <- df$date_num * (-1)
df <- df[order(df$date_num_rev),]

library(tidyverse)

# 创建reNoShow和reNoShow_f
df <- df %>%
  group_by(Person) %>%
  mutate(reNoShow = lag(as.numeric(cumsum(NoShow) > 0)),
         reNoShow_f = lag(cumsum(NoShow), default = 0)*(date != lag(date)),
         reNoShow_f = case_when(
           is.na(reNoShow_f) ~ 0,
           reNoShow_f == 0 ~ lag(reNoShow_f),
           TRUE ~ reNoShow_f
         ))

# 处理NA值
df$reNoShow_f[is.na(df$reNoShow_f)] <- 0

# 创建nextNoShow和计算天数
df <- df %>%
  group_by(Person) %>%
  mutate(nextNoShow=ifelse(c(FALSE, diff(reNoShow_f))!=0, lag(date),NA)) %>%
  fill(nextNoShow)

df$daysto_nextNoShow <- as.numeric(difftime(df$nextNoShow, df$date, units = c('days')))
df$reNoShow_2y <- ifelse(df$reNoShow==1 & df$daysto_nextNoShow >= 730 & df$date!=df$nextNoShow,0,1)

解决方案:统计两年内爽约次数

核心思路是将date转换为标准日期类型后,对每个用户的每一行日期,筛选出该日期之后两年内的所有记录,统计其中NoShow的总和(排除当前行自身的爽约记录)。

添加以下代码生成目标变量(命名为noshow_count_2y):

# 转换date为标准日期格式
df$date <- as.Date(df$date)

# 分组计算每个日期两年内的爽约次数
df <- df %>%
  group_by(Person) %>%
  mutate(noshow_count_2y = map_dbl(date, ~ sum(NoShow[date >= .x & date <= .x + years(2) & date != .x]))) %>%
  ungroup()

运行后noshow_count_2y列的结果为0,0,0,1,2,0,0,1,0,与预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:40:32