使用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
相关产品推荐
相关产品推荐

