我有一个类似于以下内容的数据集:
ID COL70 COL71 COL72 COL73 COL74
1 4 3 2 -998 .
2 2 0 2 1 -998
3 1 -998 -998 . .
4 3 4 -998 -998 -998
我要做的是有一个新列,将其称为NEWCOL,它具有从COL74向后看的第一个非负值,因此它将如下所示:
ID COL70 COL71 COL72 COL73 COL74 NEWCOL
1 4 3 2 -998 . 2
2 2 0 2 1 -998 1
3 1 -998 -998 . . 1
4 3 4 -998 -998 -998 4
我正在使用WPS,因此请使用SAS或PROC SQL。
答案 0 :(得分:5)
您可以像这样遍历数组。
data have;
array c[*] col70-col74;
input id c[*];
do i = dim(c) to 1 by -1 until(sign(c[i]) eq 1);
newcol=c[i];
end;
if i eq 0 then newcol=.;
cards;
1 4 3 2 -998 .
2 2 0 2 1 -998
3 1 -998 -998 . .
4 3 4 -998 -998 -998
5 -3 -4 -998 -998 -998
;;;;
run;
proc print;
run;
答案 1 :(得分:0)
我想为任何想要相同的人解决这个问题:
data want;
set have;
temp = 0;
num = 74;
array col{70:74} col70-col74;
do while (temp = 0);
if col{num} >= 0 then do;
newvar = col{num};
temp = 1;
end;
else num = num - 1;
end;
run;
答案 2 :(得分:0)
在SQL中,简单的case
表达式可以“备份”到所需结果
proc sql;
create table want as
select have.*
,
case
when col74 > 0 then col74
when col73 > 0 then col73
when col72 > 0 then col72
when col71 > 0 then col71
when col70 > 0 then col70
else .
end as last_positive
from have
;
quit;