使用tidyverse筛选PAN列同时含YES和NO的ID对应行
筛选同时包含PAN列YES和NO的ID对应的所有行
需求说明
从包含ID和PAN列的数据框df1中,仅保留那些在PAN列同时存在"YES"和"NO"取值的ID对应的所有行(即示例中的ID 1、2、5的全部记录)。
方法1:Base R 原生实现
无需额外包,用原生函数即可完成:
# 第一步:筛选出符合条件的ID(同时包含YES和NO的ID) valid_ids <- unique(df1$ID[ave(df1$PAN, df1$ID, FUN = function(x) length(unique(x))) == 2]) # 第二步:提取对应ID的所有行 result <- df1[df1$ID %in% valid_ids, ]
逻辑说明:
ave()按ID分组,计算每个分组内PAN的唯一值数量- 筛选出唯一值数量为2的ID,再通过
%in%提取这些ID的全部行
方法2:dplyr 包实现(tidyverse 风格)
如果习惯使用tidyverse生态,代码更简洁直观:
library(dplyr) result <- df1 %>% group_by(ID) %>% # 按ID分组 filter(n_distinct(PAN) == 2) %>% # 保留分组内PAN有2种取值的行 ungroup() # 取消分组
逻辑说明:
group_by(ID)按ID分组后,n_distinct(PAN)统计每组内PAN的唯一值数量- 直接筛选出唯一值数量为2的分组的所有行,无需额外提取ID的步骤
运行结果
两种方法得到的result均为:
ID PAN 1 1 NO 2 1 YES 3 2 YES 4 2 NO 5 5 NO 6 5 YES
内容的提问来源于stack exchange,提问作者Kerry Quinn
相关产品推荐
相关产品推荐

