R使用filter筛选含NA的日期数据并保留目标行的实现方法
实现方案
核心是用或逻辑同时覆盖两种保留场景,避免含有效NA的行被误筛,完整实现步骤如下:
1. 前置说明
需要先确保Date、FromDate、ToDate三个字段为相同的日期类型,避免字符串或数值比较出错。如果你的Date列仅存储年份,需要转成统一的日期格式(比如当年1月1日)再进行范围判断。
2. 完整可复现代码
# 加载依赖包 library(dplyr) # 构造示例数据集 df <- data.frame( Id = c(1,2,3,3,4,5), Col1 = c("Blue","Green","Red","Red","Yellow","Purple"), Date = c(2018,2018,2010,2010,2020,2011), FromDate = c(NA,NA,"2009-05-15","2015-10-15","2019-10-15",NA), ToDate = c(NA,NA,"2015-09-15","2020-08-15","2021-05-15",NA), Weight = c(24.9,14.5,87.5,43.8,29.5,NA) ) # 转换为统一日期格式 df <- df %>% mutate( # 仅存年份的话转成当年1月1日,若本身是完整日期可跳过这行 Date = as.Date(paste0(Date, "-01-01")), FromDate = as.Date(FromDate), ToDate = as.Date(ToDate) ) # 按规则筛选 df_result <- df %>% filter( # 场景1:两个范围字段均为NA,直接保留 (is.na(FromDate) & is.na(ToDate)) | # 场景2:两个范围字段均非空时,判断Date落在区间内 (Date >= FromDate & Date <= ToDate) )
3. 逻辑说明
- 两个场景用
|连接,满足任意一个即可保留 - 若某行只有
FromDate或ToDate其中一个为NA,两个条件都不满足,会被自动排除,符合常规数据清洗逻辑 - 不会误删合法的NA行:
FromDate和ToDate均为NA的行会命中第一个条件直接保留,不会进入范围判断逻辑
内容的提问来源于stack exchange,提问作者bison2178
相关产品推荐
相关产品推荐

