如何在R中为spread()生成的宽表添加日期归属状态列?
R中新增预约状态列的解决方案
核心思路
先基于现有日期列计算max_appointment_date,再通过匹配该日期对应的原始列,生成对应的中文状态标签(完成/已预约/取消)。
代码实现
先加载dplyr包(未安装的话先运行install.packages("dplyr")),再处理数据:
library(dplyr) # 示例宽表(替换为你的实际数据) df <- tibble( cancelled = as.Date(c("2022-10-17", NA, "2022-08-01")), Completed = as.Date(c("2022-10-10", "2022-09-20", NA)), Scheduled = as.Date(c("2022-09-05", NA, "2022-07-15")) ) # 生成目标列 df_processed <- df %>% mutate( # 计算最大预约日期:优先取Completed/Scheduled的最大值,无值则取cancelled max_appointment_date = pmax(Completed, Scheduled, na.rm = TRUE), max_appointment_date = ifelse(is.na(max_appointment_date), cancelled, max_appointment_date), max_appointment_date = as.Date(max_appointment_date, origin = "1970-01-01"), # 匹配对应的状态标签 max_appointment_status = case_when( max_appointment_date == Completed ~ "完成", max_appointment_date == Scheduled ~ "已预约", max_appointment_date == cancelled ~ "取消", TRUE ~ NA_character_ ) )
结果说明
运行后得到的df_processed会包含目标列,示例输出如下:
| cancelled | Completed | Scheduled | max_appointment_date | max_appointment_status |
|---|---|---|---|---|
| 2022-10-17 | 2022-10-10 | 2022-09-05 | 2022-10-10 | 完成 |
| NA | 2022-09-20 | NA | 2022-09-20 | 完成 |
| 2022-08-01 | NA | 2022-07-15 | 2022-08-01 | 取消 |
注意事项
- 若
Completed和Scheduled日期相同,case_when会优先匹配第一个条件(标记为"完成"),可根据需求调整条件顺序。 - 确保所有日期列的类型为
Date,否则需先用as.Date()转换格式。
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

