dplyr filter筛选Date类型日期时不等于条件返回结果异常
问题原因
- R语言中
NA属于缺失值标识,和任意值做==、!=等逻辑比较时,返回结果均为NA,而非TRUE或FALSE - dplyr的
filter()函数仅会保留判断条件返回值为TRUE的行,返回FALSE和NA的行都会被直接排除 - 你的数据集
dob列共有14行等于1899-01-01、15行等于其他日期、16行是NA值。执行dob != '1899-01-01'时,16个NA行的判断结果为NA会被过滤,最终仅返回15行非目标日期的非NA行,和预期31行的结果不符。
解决方案
如果你需要保留所有不等于1899-01-01的行(包含NA值的行),可以使用以下任意一种方法:
方案1:显式在条件中加入is.na()判断
test_exclude <- test_df %>% filter(dob != '1899-01-01' | is.na(dob))
方案2:使用%in%匹配后取反
%in%运算符对NA值的匹配结果返回FALSE,取反后即可保留NA行:
test_exclude <- test_df %>% filter(!dob %in% as.Date('1899-01-01'))
方案3:用coalesce()统一处理逻辑值的NA
用coalesce()将判断返回的NA替换为TRUE,即可保留对应行:
test_exclude <- test_df %>% filter(coalesce(dob != '1899-01-01', TRUE))
内容的提问来源于stack exchange,提问作者user16497487
相关产品推荐
相关产品推荐

