在 SAS 中保留组内变量的值
Retain the value of a variable within a group in SAS
我想创建一个等于 1 的变量 Var2,从第一次观察开始 Var1 等于 1,Var2 等于 1,直到 ID 定义的组结束。
这是最小的工作示例:
ID 年份 Var1
1 1 .
1 2 0
1 3 .
1 4 1
1 5 .
我想创建以下输出:
ID 年份 Var1 Var2
1 1 。 .
1 2 0 0
1 3 。 0
1 4 1 1
1 5 。 1
我目前的代码如下:
DATA data1;
SET data0;
BY ID YEAR ;
IF LAST.ID THEN END = _N_;
IF Var1 > 0 THEN CNT=_N_;
RUN;
DATA data2;
SET data1;
BY ID YEAR ;
Var2 = 0;
IF Var1 = 1 THEN DO;
DO I = CNT TO END;
Var[I] = 1;
END;
END;
RUN;
但是,SAS 不会循环观察。
我不确定您的示例在做什么,但这相当简单。
data want;
set have;
by id;
retain var2;
if first.id then var2=0;
if var1=1 then var2=1;
run;
保留var2
以在观察中保持其值,然后在var1
中看到1时将其设置为1;最后,当您看到 first.id
行时将其设置为 0。
我想创建一个等于 1 的变量 Var2,从第一次观察开始 Var1 等于 1,Var2 等于 1,直到 ID 定义的组结束。 这是最小的工作示例:
ID 年份 Var1
1 1 .
1 2 0
1 3 .
1 4 1
1 5 .
我想创建以下输出:
ID 年份 Var1 Var2
1 1 。 .
1 2 0 0
1 3 。 0
1 4 1 1
1 5 。 1
我目前的代码如下:
DATA data1;
SET data0;
BY ID YEAR ;
IF LAST.ID THEN END = _N_;
IF Var1 > 0 THEN CNT=_N_;
RUN;
DATA data2;
SET data1;
BY ID YEAR ;
Var2 = 0;
IF Var1 = 1 THEN DO;
DO I = CNT TO END;
Var[I] = 1;
END;
END;
RUN;
但是,SAS 不会循环观察。
我不确定您的示例在做什么,但这相当简单。
data want;
set have;
by id;
retain var2;
if first.id then var2=0;
if var1=1 then var2=1;
run;
保留var2
以在观察中保持其值,然后在var1
中看到1时将其设置为1;最后,当您看到 first.id
行时将其设置为 0。