Заменить строку на предыдущую / переслать другую строку в SAS - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть набор данных, который содержит -1, который совпадает с отсутствующим, который я хотел бы заменить ранее известным, и который не найден с известным заранее.По группам V1 и V2

Пример:

data test;
    input V1 $ V2 $ V3 $;
    infile datalines delimiter=',';
datalines;
A,X,AA0
A,X,-1
A,X,AA0
A,Y,-1
A,Y,BB2
B,X,-1
B,X,-1
B,X,CC1
B,Y,-1
B,Y,-1
;

После первого запуска (заполнение)

   V1    V2    V3   
 1 A     X     AA0  
 2 A     X     AA0  
 3 A     X     AA0  
 4 A     Y     -1
 5 A     Y     BB2  
 6 B     X     -1   
 7 B     X     -1
 8 B     X     CC1  
 9 B     Y     -1
10 B     Y     -1

После второго запуска (заполнение):

   V1    V2    V3   
 1 A     X     AA0  
 2 A     X     AA0  
 3 A     X     AA0  
 4 A     Y     BB2  
 5 A     Y     BB2  
 6 B     X     CC1  
 7 B     X     CC1  
 8 B     X     CC1  
 9 B     Y     NA   
10 B     Y     NA 

Я обнаружил, что есть похожий вопрос здесь

Однако я не получаю желаемого результата при замене '.'для '-1' и замененных значений, например, AA0 становится AA.

Это моя попытка:

proc sort data=test;
  by V1
     V2;
run;
data want;
  set test;
  by V1 V2;
  retain new_var ('-1');

  if not last.V1 and V3 ne '-1' then new_var=V3;
  else if V3 = '-1' then V3 = new_var;
  if last.V1 then new_var = '-1';

   /* drop year_tmp; */
run;

1 Ответ

0 голосов
/ 15 сентября 2018

Используйте цикл DOW, чтобы найти первое не пропущенное прямое значение V3, а затем второй цикл по группе, использующий другой буфер SET, чтобы отследить самое последнее предыдущее значение V3 в группе и заполнить либо необходимый прямой V3, либо предыдущий V3.Код выполняет заполнение с приоритетом приоритет перед первым.

data want;
  length firstv3 priorv3 $8;

  do _n_ = 1 by 1 until (last.v2);
    set test;
    by v1 v2;
    if missing(firstv3) and v3 ne '-1' then firstv3 = v3;
  end;

  do _n_ = 1 to _n_;
    set test;

    if v3 ne '-1' then
      priorv3 = v3;
    else do;
      if not missing(priorv3) then v3 = priorv3;
      else
      if not missing(firstv3) then v3 = firstv3;
    end;

    output; 
  end;
run;
...