You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr按条件部分筛选数据框:保留NA行+过滤日期符合条件行

问题

需要用dplyr对数据框执行筛选,规则如下:

  • 保留所有id为NA的行
  • 对id不为NA的行,仅保留date处于report_start与report_end之间(包含边界值)的行

示例数据框代码:

tbl <- tribble(
  ~account, ~date, ~id, ~report_start, ~report_end,
  "a", as.Date('2022-09-03'), NA, NA, NA,
  "b", as.Date('2022-09-03'), NA, NA, NA,
  "c", as.Date('2022-09-03'), NA, NA, NA,
  "c", as.Date('2022-09-03'), NA, NA, NA,
  "e", as.Date('2022-09-03'), 1, as.Date('2022-07-04'), as.Date('2022-10-02'),
  "e", as.Date('2022-09-03'), 1, as.Date('2022-10-03'), as.Date('2022-12-15'),
  "e", as.Date('2022-09-03'), 2, as.Date('2022-03-28'), as.Date('2022-07-03'),
  "f", as.Date('2022-09-03'), NA, NA, NA,
  "g", as.Date('2022-09-03'), 2, as.Date('2022-07-04'), as.Date('2022-10-02'),
  "g", as.Date('2022-09-03'), 3, as.Date('2022-07-04'), as.Date('2022-12-15'),
)

此前尝试的代码会过滤掉所有id为NA的行,无法满足需求:

df <- tbl %>%
  filter(!is.na(id), (date >= report_start & date <= report_end))

解决方案

核心是用逻辑或(|)把两个筛选条件组合:保留id为NA的行,或者(id不为NA且日期符合范围)的行。

完整写法

df <- tbl %>%
  filter(is.na(id) | (!is.na(id) & date >= report_start & date <= report_end))

简化写法

由于R的逻辑或运算支持短路求值(当第一个条件is.na(id)为真时,不会执行后面的条件判断),因此可以简化为:

df <- tbl %>%
  filter(is.na(id) | (date >= report_start & date <= report_end))

结果验证

执行后会得到符合预期的筛选结果:

  • 所有id为NA的行全部保留
  • id不为NA的行中,仅保留date在report_start和report_end区间内的行,比如e账号id=1的第一行、g账号的id=2和id=3行会被保留,其余不符合日期条件的行被过滤。

内容的提问来源于stack exchange,提问作者winlai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:51:36