我在SAS中有一个数据集,其中包含SN和RT列,我想要创建另一个列,条件应该是 RT 列表中 SN <1 < / strong>应该做1并且保持连续数字1做0,请找下面的例子。
表1
SN RT
1 0
1 0
1 1
1 1
1 0
2 0
2 0
3 1
3 1
3 1
4 0
4 1
4 1
4 0
输出表如下:
SN RT Newvar
1 0 0
1 0 0
1 1 1
1 1 0
1 0 0
2 0 0
2 0 0
3 1 1
3 1 0
3 1 0
4 0 0
4 1 1
4 1 0
4 0 0
答案 0 :(得分:1)
我得到了这个问题的答案,谢谢你的回答
data TABLE2 ;
set TABLE1;
by SN RT;
IF first.SN AND first.RT then RETIRE = 1;ELSE RETIRE=0 ;
WHERE RT=1;
run;
PROC SQL;
CREATE TABLE RETIREMENT(drop=RT) AS
SELECT T1.*
,T2.RETIRE
FROM TABLE1 T1
LEFT JOIN TABLE2 T2
ON T1.SN =T2.SN ;
QUIT;
答案 1 :(得分:0)
假设您的输入表(table1)按SN排序,以下代码应执行所需的操作:
data newtable (drop=_x);
set table1;
by SN;
if first.SN then _x = 1;
if RT = 1 and _x then do;
newvar = 1;
_x = 0;
end;
else newvar = 0;
run;
当找到SN
的第一个值时,标记_x
设置为1,这基本上表示&#39;开始检查RT = 1&#39;。当我们找到第一个RT = 1
时,我们设置newvar = 1
,然后重置_x
标记,以便仅在RT = 1
的第一次出现时设置newvar可以在同一个SN
&#39;组中找到。
答案 2 :(得分:0)
希望这就是你要找的东西。这不是最优雅的解决方案,但应该可以解决问题。
DATA given;
INPUT sn $ rt;
DATALINES;
1 0
1 0
1 1
1 1
1 0
2 0
2 0
3 1
3 1
3 1
4 0
4 1
4 1
4 0
;
RUN;
PROC SORT DATA = given;
BY sn rt;
RUN;
DATA new;
SET given;
BY sn rt;
firstrt = first.rt;
first_occure = rt*firstrt;
DROP firstrt;
RUN;
PROC PRINT DATA = new;
RUN;