如何移除SessionTime不一致的受试者ID?求SAS实现代码示例
批量移除SessionTime不一致的受试者ID的SAS代码
需求说明:每个受试者ID对应8条观测值,且同一ID的SessionTime必须完全一致。若某ID存在多种不同的SessionTime(如示例中的ID#5),需将该ID的所有观测值批量移除。
以下提供两种可行的SAS实现方法:
方法一:使用PROC SQL关联筛选
/* 第一步:统计每个ID的不同SessionTime数量 */ proc sql; create table valid_ids as select id from work group by id having count(distinct SessionTime) = 1; /* 只保留SessionTime唯一的ID */ quit; /* 第二步:从原数据中筛选出符合条件的ID */ proc sql; create table work_cleaned as select * from work where id in (select id from valid_ids); quit;
方法二:使用DATA步+PROC SORT标记过滤
/* 第一步:按ID和SessionTime排序 */ proc sort data=work; by id SessionTime; run; /* 第二步:标记存在多个SessionTime的ID */ data marked_ids; set work; by id; retain has_multiple 0; if first.id then do; has_multiple = 0; prev_time = SessionTime; end; else if SessionTime ne prev_time then do; has_multiple = 1; prev_time = SessionTime; end; if last.id then output; /* 仅保留每个ID的最后一条标记记录 */ keep id has_multiple; run; /* 第三步:筛选出符合条件的ID并合并回原数据 */ proc sql; create table work_cleaned as select w.* from work w inner join marked_ids m on w.id = m.id where m.has_multiple = 0; quit;
验证结果
运行上述任意一种方法后,生成的work_cleaned数据集将仅保留ID#1、#2、#3、#4的所有观测值,ID#5的8条记录会被全部移除,符合需求。
内容的提问来源于stack exchange,提问作者Chirag Vyas
相关产品推荐
相关产品推荐

