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

使用dplyr完成单因子层级满足多条件的与/或条件过滤

问题背景

示例数据框如下:

data <- data.frame(ID = rep(letters[1:4], each= 4),
                   Year = c('1990','1990','1990','1990',
                            '1990','1990','2000', '2000',
                            '1990','1990','1990','1990',
                            '1990','1990','2000', '2000'))

数据集说明:共4个唯一ID,2个年份取值。其中ID为a、c的样本只有1990年的观测,ID为b、d的样本同时有1990和2000年的观测。需求是筛选出同时拥有两个年份观测的ID对应的全部样本,预期结果如下:

ID Year
1   b 1990
2   b 1990
3   b 2000
4   b 2000
5   d 1990
6   d 1990
7   d 2000
8   d 2000

原有错误写法说明:先按ID分组后直接用filter(Year == '1990' & Year == '2000')无法得到正确结果,因为filter是逐行判断条件,单一行的Year字段只能取一个值,不可能同时满足等于1990和2000,所以所有行的判断结果都为假,最终输出空数据集。

正确实现方法

方法1:指定目标年份匹配(精准匹配需要的两个年份)

如果明确要筛选同时存在1990、2000两个年份的ID,可以用all()搭配%in%判断分组内是否同时包含两个目标年份:

library(dplyr)

data %>%
  group_by(ID) %>%
  filter(all(c("1990", "2000") %in% Year)) %>%
  ungroup() # 不需要保留分组结构时可添加

方法2:按年份数量筛选(适配多场景)

如果需求是筛选出所有存在至少2个不同年份观测的ID,不需要特指具体年份,可以直接用n_distinct()统计分组内的年份数量:

data %>%
  group_by(ID) %>%
  filter(n_distinct(Year) == 2) %>%
  ungroup()

两种方法输出的结果都符合预期要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:15:03