如何在R中创建累积日期达阈值后持续保持phase的函数?
解决方案
你的需求核心是实现状态的持续性:一旦进入某个phase,后续所有日期都保持该状态,不会回退。现有代码通过case_when能正确匹配每个日期对应的phase,但缺少初始阶段定义,且未处理状态延续逻辑。
以下是两种实现方式:
方法一:使用tidyverse工具(简洁推荐)
借助dplyr的条件判断和tidyr的填充函数,轻松实现状态延续:
library(dplyr) library(tidyr) create_phase <- function(cumulative_date) { tibble(cumulative_date = cumulative_date) %>% mutate(phase = case_when( cumulative_date >= 8.3 ~ "phase3", cumulative_date >= 6.3 ~ "phase2", cumulative_date >= 2.6 ~ "phase1", TRUE ~ "pre-phase" # 定义初始阶段,避免NA )) %>% fill(phase, .direction = "down") # 向下填充,让后续日期继承最后一个有效phase } # 测试代码 cumulative_date <- 1:10 result <- create_phase(cumulative_date) print(result)
运行结果:
# A tibble: 10 × 2 cumulative_date phase <int> <chr> 1 1 pre-phase 2 2 pre-phase 3 3 phase1 4 4 phase1 5 5 phase1 6 6 phase1 7 7 phase2 8 8 phase2 9 9 phase3 10 10 phase3
方法二:Base R实现(无需额外包)
如果不想加载tidyverse包,可通过循环实现状态填充:
create_phase <- function(cumulative_date) { # 初始化phase向量 phase <- character(length(cumulative_date)) # 按优先级从高到低分配phase phase[cumulative_date >= 8.3] <- "phase3" phase[cumulative_date >= 6.3 & phase == ""] <- "phase2" phase[cumulative_date >= 2.6 & phase == ""] <- "phase1" phase[phase == ""] <- "pre-phase" # 循环填充,确保状态延续 for (i in 2:length(phase)) { phase[i] <- phase[i-1] } return(data.frame(cumulative_date, phase)) } # 测试代码 cumulative_date <- 1:10 result <- create_phase(cumulative_date) print(result)
关键逻辑说明
- 优先级顺序:条件判断必须按阈值从高到低执行,确保高优先级的
phase3不会被低优先级的状态覆盖。 - 状态延续:通过
fill函数或循环实现“向下填充”,让每个日期继承前一个日期的phase,保证进入阶段后持续保持状态。 - 初始阶段:新增
pre-phase作为默认值,避免出现NA结果,贴合实际业务逻辑。
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

