如何解读SAS代码中if first.y then zzz="Y"; else delete;这段逻辑?
SAS代码片段逻辑解读:
if first.y then zzz = "Y"; else delete; by New_Col y; 核心作用
这段代码的本质是:在按New_Col和y组合分组的数据集中,仅保留每个(New_Col, y)组合的第一条观测,并为这些保留的观测新增一个值为"Y"的变量zzz。
逐部分拆解
by New_Col y;- 当SAS Data步中使用
BY语句时,会自动生成两个临时布尔变量:first.变量和last.变量(取值为1/0,代表真/假)。 - 这里的分组逻辑是:先按
New_Col将数据分成大组,再在每个New_Col大组内,按y分成子组。first.y用来标记当前New_Col组内,某个y值对应的第一条观测。
- 当SAS Data步中使用
if first.y then zzz = "Y"; else delete;- 当观测是当前
(New_Col, y)组合的第一条时:给变量zzz赋值为"Y",并保留该观测。 - 当观测不是当前
(New_Col, y)组合的第一条时:执行delete语句,直接丢弃该观测。
- 当观测是当前
结合示例数据的实际效果
先看original_data_1的原始数据:
| x | y | z | z1 | New_Col |
|---|---|---|---|---|
| 1 | 4 | 76 | 1 | AAA |
| 2 | 3 | 49 | 0 | AAA |
| 2 | 3 | 85 | 0 | BBB |
| 4 | 5 | 88 | 0 | BBB |
| 2 | 2 | 90 | 1 | BBB |
按New_Col y分组后,每个组合的第一条观测都会被保留:
AAA组内:y=4、y=3的第一条观测均保留BBB组内:y=3、y=5、y=2的第一条观测均保留
最终data_2的输出结果:
| x | y | z | z1 | New_Col | zzz |
|---|---|---|---|---|---|
| 1 | 4 | 76 | 1 | AAA | Y |
| 2 | 3 | 49 | 0 | AAA | Y |
| 2 | 3 | 85 | 0 | BBB | Y |
| 4 | 5 | 88 | 0 | BBB | Y |
| 2 | 2 | 90 | 1 | BBB | Y |
注意事项
使用BY语句时,输入数据集必须先按BY变量排序(或建立对应的索引),否则first./last.的判断会出错。用户的原代码中缺少排序步骤,实际运行前需添加:
proc sort data=original_data_1; by New_Col y; run;
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

