如何使用SAS基于多条件匹配同表观测并标记匹配结果?
在SAS中标记同表内多条件匹配且特定变量取值不同的观测
当然没问题!SAS完全能搞定你说的这种同表多条件匹配标记需求——也就是找出年龄、性别相同,但「Like star wars」取值不一样的观测并标记出来。下面给你两种实用的实现方法,你可以根据自己的习惯选择:
先准备测试数据集
首先我们把你给出的原始数据转换成SAS可识别的数据集:
data have; input age gender $ "Like star wars"n Location $; datalines; 34 male 1 US 36 female 0 UK 24 female 1 AU 45 female 1 US 34 male 0 CH 36 female 1 US 57 female 0 US ; run;
注:因为变量名「Like star wars」包含空格,所以在SAS中需要用"Like star wars"n的格式引用它
方法一:使用PROC SQL(快速简洁)
这种方法通过子查询检查每个观测对应的年龄、性别组内是否存在取值不同的「Like star wars」记录,直接生成标记:
proc sql; create table want as select a.*, case when exists (select 1 from have b where b.age = a.age and b.gender = a.gender and b."Like star wars"n ne a."Like star wars"n) then 'Yes' else 'No' end as Match from have a; quit;
逻辑说明
对每一条观测a,我们在同一张表中查找是否存在另一条观测b满足:
- 年龄和性别与
a完全相同 - 「Like star wars」的取值和
a不一样
如果存在这样的观测,就标记为Yes,否则标记为No。
方法二:使用DATA步(灵活可扩展)
如果后续需要对分组逻辑做更多扩展,DATA步会更合适。我们先按年龄、性别排序,再通过分组统计判断组内是否同时存在0和1:
- 先排序分组
proc sort data=have; by age gender; run;
- 遍历分组并标记
data want; set have; by age gender; /* 保留组内的最小和最大取值 */ retain group_min group_max; /* 每个分组的第一条观测初始化min和max */ if first.gender then do; group_min = "Like star wars"n; group_max = "Like star wars"n; end; /* 后续观测更新min和max */ else do; group_min = min(group_min, "Like star wars"n); group_max = max(group_max, "Like star wars"n); end; /* 到分组最后一条观测时,判断是否同时存在0和1 */ if last.gender then do; group_has_both = (group_min ne group_max); end; /* 把判断结果保留到组内所有观测 */ retain group_has_both; /* 生成最终的Match标记 */ Match = ifc(group_has_both, 'Yes', 'No'); /* 删除中间变量 */ drop group_min group_max group_has_both; run;
逻辑说明
- 先按年龄、性别排序,确保相同组的观测连在一起
- 遍历每个分组时,记录组内「Like star wars」的最小和最大值
- 如果最小值≠最大值,说明组内同时存在0和1,给整个组的所有观测标记
Yes,否则标记No
最终输出示例
运行上述任一代码后,你会得到符合需求的结果,示例片段如下:
age gender Like star wars Location Match
34 male 1 US Yes
34 male 0 CH Yes
36 female 0 UK Yes
36 female 1 US Yes
24 female 1 AU No
45 female 1 US No
57 female 0 US No
内容的提问来源于stack exchange,提问作者Kul
相关产品推荐
相关产品推荐

