R数据框选取首个非缺失日期异常:recrstdt为NA时未取start_date
R数据框日期列取值问题排查与解决
核心问题分析
你的recrstdt列显示为<NA>,但从数据结构可以看到,实际存储的是Inf(无穷大值,而非Date类型的真正缺失值NA):
is.na(recrstdt)对Inf返回FALSE,导致check列始终为2,无法触发选取start_date的逻辑- 基础R的
ifelse函数会自动剥离Date类型的属性,将日期转换为底层数值(如你看到的16425),破坏了日期格式
解决方案
1. 修复recrstdt的异常值
先将Inf替换为Date类型的真正缺失值NA:
df$recrstdt[is.infinite(df$recrstdt)] <- NA
2. 实现正确的取值逻辑
推荐使用dplyr的coalesce函数,它专门用于“取第一个非缺失值”的场景,且能保留Date类型:
library(dplyr) df <- df %>% mutate(check = if_else(is.na(recrstdt), 1, 2), sdt = coalesce(recrstdt, start_date))
如果坚持使用条件判断,用dplyr的if_else(比基础R的ifelse更严格,保留数据类型):
df <- df %>% mutate(check = if_else(is.na(recrstdt), 1, 2), sdt = if_else(!is.na(recrstdt), recrstdt, start_date))
效果验证
处理后,recrstdt为缺失值的行,check会被设为1,sdt会正确选取start_date的日期值,且保留Date类型。
内容的提问来源于stack exchange,提问作者Ashok G
相关产品推荐
相关产品推荐

