Возвращаясь назад, выберите первое неотрицательное число SAS - PullRequest
0 голосов
/ 09 января 2019

У меня есть набор данных, который выглядит примерно так:

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 голосов
/ 09 января 2019

Я понял это для тех, кто хочет того же:

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;
0 голосов
/ 09 января 2019

В 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;
0 голосов
/ 09 января 2019

Вы можете перебирать массив таким образом.

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

...