在R中使用dplyr和mutate对新变量分类的技术问题
问题:创建基于预约间隔的Retention分类变量
需求说明:
- 需生成名为
Retention的分类变量,划分规则如下:- 若用户有后续预约,按当前预约与上一次预约的间隔天数分类
- 若用户无后续预约,按首次预约日期至当前日期的间隔天数分类
- 最终分为三类:
- 3个月内留存(间隔<90天)
- 6个月内留存(间隔90-180天)
- 未留存(间隔>180天)
原代码存在的问题:
- 变量名不统一:手动创建了数据但代码中引用了未定义的
data/test对象;Visit_Date与原始数据的visit_date大小写不一致 Time_Since_Appointment被转成带时分秒的period类型,无法直接与数字天数比较- 未处理无后续预约的用户(分组最后一条记录),未计算其到当前日期的间隔
- 分类逻辑有漏洞:遗漏了91天这类边界值,区间覆盖不完整
修正后的完整代码
# 加载依赖包 library(dplyr) library(lubridate) # 创建原始数据(修正NA表示,用原生NA而非字符串"NA") record_id <- c(1,1,1,2,3,4,4,5,6,7,8,8,9,10,10,10) visit_date <- c("2018-09-24", "2018-12-05", "2019-03-01", "2018-10-03", "2018-10-01", "2018-10-05", NA, "2018-08-25", "2018-09-19", "2018-10-01", "2018-09-27", "2021-09-07", "2018-10-03", "2018-10-08", "2019-03-22", "2019-07-12") repeat_instance <- c(0,1,2,0,0,0,1,0,0,0,0,1,0,0,1,2) # 数据预处理:转日期格式+过滤无效日期 data <- tibble(record_id, visit_date, repeat_instance) %>% mutate(visit_date = ymd(visit_date)) %>% filter(!is.na(visit_date)) # 分组计算间隔+生成Retention变量 data_processed <- data %>% group_by(record_id) %>% arrange(visit_date) %>% # 确保按预约时间排序 mutate( # 计算当前与上一次预约的间隔天数 days_interval = as.numeric(visit_date - lag(visit_date)), # 对无后续预约的记录,替换为首次预约到当前日期的间隔 first_visit = first(visit_date), days_interval = ifelse(row_number() == n(), as.numeric(today() - first_visit), days_interval) ) %>% ungroup() %>% mutate( Retention = case_when( days_interval < 90 ~ "3个月内留存", days_interval >= 90 & days_interval <= 180 ~ "6个月内留存", days_interval > 180 ~ "未留存", TRUE ~ NA_character_ # 处理异常值 ) ) # 查看结果 print(data_processed)
关键说明
- 日期处理:用
ymd()将字符串转为标准日期格式,避免类型混乱 - 间隔计算:将日期差转成数值型天数,解决
period类型无法直接比较的问题;针对无后续预约的用户,自动计算首次预约到当前的间隔 - 分类逻辑:修正区间边界,确保90、180天这类临界值被正确归类,同时保留异常值处理分支
内容的提问来源于stack exchange,提问作者Ariana Johnson
相关产品推荐
相关产品推荐

