向后选择第一个非负数SAS

时间:2019-01-09 14:22:45

标签: arrays sas do-loops

我有一个类似于以下内容的数据集:

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。

3 个答案:

答案 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;

enter image description here

答案 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;