在R语言中筛选特定ID:无sup状态且类型切换分析
R语言数据筛选分步实现
需求说明
需要完成两项数据筛选任务:
- 筛选所有在
type为N时从未出现status为sup的ID,即仅保留type=N阶段status只有unsup或NA的ID对应的所有数据 - 从第一步筛选结果中,进一步筛选出存在从
type=N切换到type=P的ID数据
样本数据
data <- data.frame( id = c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7), type = c('N','N','N', 'N', 'P','P','N','N','N', 'I', 'I','N','N','N', 'N', 'N','N','N','N', 'O', 'O','N','N','N', 'O','N','N','N', 'P', 'P', 'N','N','P'), status = c(NA,'unsup',NA,'unsup',NA,'sup',NA,NA,'sup',NA,'sup','unsup',NA,'unsup',NA, 'unsup','unsup',NA,'unsup',NA,'sup','sup',NA,NA,'unsup',NA,'unsup','unsup','unsup','sup', NA, NA, 'sup') )
分步实现(使用dplyr包)
首先加载dplyr包:
library(dplyr)
第一步:筛选type=N时无sup记录的ID
# 第一步筛选结果 step1_result <- data %>% group_by(id) %>% # 确保该ID所有type=N的记录中,status都不是sup filter(all(!(type == 'N' & status == 'sup'))) %>% ungroup()
预期第一步结果:排除id=2、5、7,保留id=1、3、4、6的所有数据
第二步:筛选存在N→P切换的ID
# 第二步筛选结果 step2_result <- step1_result %>% group_by(id) %>% # 筛选同时存在type=N和type=P的ID(即有切换到P的记录) filter(any(type == 'N') & any(type == 'P')) %>% ungroup()
预期第二步结果:仅保留id=1、6的所有数据
结果验证
查看最终结果的ID记录:
- id=1:先有N类型记录(status均为unsup/NA),后切换到P类型,符合要求
- id=6:先有N类型记录(status均为unsup/NA),后切换到P类型,符合要求
- id=3:只有N类型记录,无切换到P的操作,被排除
- id=4:从N切换到O,无P类型记录,被排除
内容的提问来源于stack exchange,提问作者Mahlet Tadesse
相关产品推荐
相关产品推荐

