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
相关产品推荐
相关产品推荐

