R中mutate嵌套ifelse无法识别第二个is.na语句的问题求解
问题原因
- 原逻辑中仅对
CP_time为NA且case_plan_start_date为空/NA的场景做了匹配,剩余CP_time为NA的场景(包括date_made缺失、两个日期同时缺失)没有完整覆盖,未匹配的场景会直接返回NA。 - 多层嵌套
ifelse可读性差,极易出现逻辑遗漏,更推荐使用dplyr自带的case_when()函数实现多分支判断。
正确实现方案
优先推荐使用case_when()实现,逻辑清晰易维护:
library(dplyr) library(lubridate) merge_data_t <- merge_data %>% # 先将日期列的空字符串统一转为NA,避免后续判断混乱 mutate( case_plan_start_date = as.Date(ifelse(case_plan_start_date == "", NA, case_plan_start_date)), date_made = as.Date(ifelse(date_made == "", NA, date_made)), CP_time = time_length(difftime(case_plan_start_date, date_made), "days"), # 按优先级从上到下匹配,满足第一个条件后不再判断后续分支 flag_time_CP = case_when( # 优先匹配缺失场景 is.na(case_plan_start_date) ~ "Missing start date", is.na(date_made) ~ "Missing legal order", # 匹配时间差分类 CP_time < 0 ~ "before order date", CP_time == 0 ~ "same date as order date", CP_time > 0 ~ "after order date", # 兜底分支 TRUE ~ "unknown" ) )
如果需要单独标记两个日期同时缺失的场景,只需要在缺失判断的最上方新增分支:is.na(case_plan_start_date) & is.na(date_made) ~ "两个日期均缺失"即可。
如果坚持使用嵌套ifelse,修正后的代码如下:
merge_data_t <- merge_data %>% mutate( case_plan_start_date = as.Date(ifelse(case_plan_start_date == "", NA, case_plan_start_date)), date_made = as.Date(ifelse(date_made == "", NA, date_made)), CP_time = time_length(difftime(case_plan_start_date, date_made), "days"), flag_time_CP = ifelse(is.na(case_plan_start_date), "Missing start date", ifelse(is.na(date_made), "Missing legal order", ifelse(CP_time < 0, "before order date", ifelse(CP_time == 0, "same date as order date", ifelse(CP_time > 0, "after order date", "unknown"))))) )
内容的提问来源于stack exchange,提问作者CHYT
相关产品推荐
相关产品推荐

