在SAS中基于CPT、PRODUCT、DATE多条件创建重复记录标识列
在SAS中创建分组标识列(flag)的实现方法
需求说明
仅当CPT、PRODUCT、DATE三者完全匹配的记录数≥2时,对应记录的flag设为1,否则为0,其他字段不参与分组判断。
输入数据集示例
CPT PRODUCT DATE A B C D etc. 1 A date1 . . . . 1 A date2 . . . . 1 C date2 . . . . 1 B date3 . . . . 1 B date3 . . . . 2 A date3 . . . . 2 B date1 . . . . 2 B date1 . . . . 2 B date2 . . . . 2 C date2 . . . . etc.
输出数据集示例
CPT PRODUCT DATE A B C D flag 1 A date1 . . . . 0 1 A date2 . . . . 0 1 C date2 . . . . 0 1 B date3 . . . . 1 1 B date3 . . . . 1 2 A date3 . . . . 0 2 B date1 . . . . 1 2 B date1 . . . . 1 2 B date2 . . . . 0 2 C date2 . . . . 0 etc.
两种实用实现方法
方法1:PROC SQL关联分组统计
用子查询先算出每个(CPT, PRODUCT, DATE)组合的记录数,再关联原表生成flag:
proc sql; create table output_data as select t1.*, case when t2.group_ge2 = 1 then 1 else 0 end as flag from input_data t1 left join ( select CPT, PRODUCT, DATE, case when count(*) >= 2 then 1 else 0 end as group_ge2 from input_data group by CPT, PRODUCT, DATE ) t2 on t1.CPT = t2.CPT and t1.PRODUCT = t2.PRODUCT and t1.DATE = t2.DATE; quit;
- 子查询按三个字段分组,标记出记录数≥2的组
- 主查询把原表和分组标记关联,直接映射出最终的flag
方法2:DATA步+BY组处理
先排序,再用BY组的内置逻辑统计组内记录数:
/* 先按分组字段排序,确保BY组逻辑生效 */ proc sort data=input_data; by CPT PRODUCT DATE; run; /* 生成flag */ data output_data; set input_data; by CPT PRODUCT DATE; /* 初始化组内计数器 */ if first.DATE then group_count = 0; group_count + 1; /* 只要组内有至少2条记录,所有成员的flag都设为1 */ flag = (group_count >= 2 or not last.DATE) * 1; run;
- 利用
first.DATE重置每组的计数器,累加得到当前组的记录数 - 通过
group_count >=2或not last.DATE(判断当前组还有后续记录)来标记flag,SAS会自动把布尔结果转为1/0
内容的提问来源于stack exchange,提问作者user23920387
相关产品推荐
相关产品推荐

