R语言按treatment1_bcr条件匹配日期生成last_visit_date列
原代码失效原因
你写的嵌套ifelse无法得到正确结果,核心问题有两个:
- R中用
==做值判断时,只要比较对象是NA,返回结果永远是NA,不会进入你写的最后一个分支取pro_date,导致treatment1_bcr为NA的行赋值错误 - 基础
ifelse处理日期类型时会自动把日期转为数值型时间戳,不加类型转换的话最终得到的不是标准日期格式 - 多层嵌套
ifelse可读性差,后续调整规则很容易写错分支顺序
推荐实现方案
你已经加载了dplyr和lubridate,直接用dplyr::case_when()做分支判断即可,这个函数可以正确处理NA值的逻辑判断,且不会打乱字段类型,原始空值会自动保留,完全匹配你的需求:
library(dplyr) library(lubridate) Prostatectomy <- Prostatectomy %>% mutate( # 若三个日期列目前是字符串/因子类型,先统一转为月/日/年格式的标准Date类型,已是日期格式可跳过此段 across(c(pro_date, lastpsa_date, treatment1_bcrdate), ~mdy(as.character(.x))), # 按指定规则生成新列 last_visit_date = case_when( treatment1_bcr == 1 ~ treatment1_bcrdate, treatment1_bcr == 0 ~ lastpsa_date, is.na(treatment1_bcr) ~ pro_date ) )
可选基础R实现
如果不想用dplyr的写法,需要先判断NA值,且在外层统一做日期类型转换,修正后的ifelse写法如下:
Prostatectomy$last_visit_date <- as.Date( with(Prostatectomy, ifelse( is.na(treatment1_bcr), pro_date, ifelse(treatment1_bcr == 1, treatment1_bcrdate, lastpsa_date) )), format = "%m/%d/%Y" )
注意:如果你的日期列已经提前用
lubridate转成了标准Date类型,基础R写法里需要指定origin = "1970-01-01"做类型转换,否则会返回错误的数值结果。
内容的提问来源于stack exchange,提问作者NishaSheshashayee
相关产品推荐
相关产品推荐

