我有以下 sas 代码
data original_data;
input x y z z1;
datalines;
1 4 76 1
2 3 49 0
2 3 85 0
4 5 88 0
2 2 90 1
;
run;
/*view dataset*/
proc print data=original_data;
data original_data_1 ;
set original_data;
length New_Col $30.;
New_Col = 'AAA';
if (z > 80) then New_Col = 'BBB';
proc print data=original_data_1;
data data_2;
set original_data_1;
if first.y then zzz = "Y";
else delete;
by New_Col y;
run;
proc print data=data_2;
我无法理解这部分
if first.y then zzz = "Y";
else delete;
by New_Col y;
这里基本上发生了什么?
任何解释都会有帮助
数据步骤中的 BY 组处理将创建 FIRST。最后。临时标志变量,指示当前观察是否是具有该命名变量值的观察组中的第一个(或最后一个)观察(在 BY 语句中所有先前变量的当前值内)。
因此 FIRST.Y 对于由 NEW_COL 和 Y 的值定义的每组观测值中的第一个观测值成立。
所以这个数据步骤
data data_2;
set original_data_1;
by New_Col y;
if first.y then zzz = "Y";
else delete;
run;
只为每组选择第一个观察值,因为所有其他观察值都被删除。它还使变量 ZZZ 在每次观察时都具有值“Y”。
请注意,使用 BY 语句时,数据步骤将期望数据已排序,除非将关键字 NOTSORTED 添加到 BY 语句。 您的示例数据集恰好具有在所有其他观测值之后 Z 大于 80 的观测值。 但对于其他数据,由于创建 NEW_COL 的步骤之后没有排序步骤,因此如果不在其之前添加排序步骤,此步骤很可能会失败。