Как я могу сохранить операцию во время удаления наблюдения в SAS? - PullRequest
0 голосов
/ 09 июля 2010

Проблема в том, что если выполняется else, приращение S не будет выполнено.Есть идеи?

data osszes_folyositas;
 set osszes_tabla;
 retain old_xname;
 retain s 0;

 if xname ne old_xname  then
 do;
  old_xname = xname; 
  s = 0;
 end;
 else
 do; 
  s = s + Foly_s_tott_t_rgyh_ban_HUF;
  delete;
 end;
run;

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Не уверен, что вы пытаетесь сделать. Но если у вас есть записи, упорядоченные по «xname», и для каждой группы «xname» просто хотите суммировать по значению, вы можете попробовать следующее.

data sample;

    input xname$1-6 myvalue;

datalines;    
name01 5
name01 1
name02 3
name02 8
name02 4
name03 7
;

data result;
    set sample;
    by xname;

    retain s 0;

    if first.xname then s=0;
    s=s+myvalue;
    if last.xname then output;
run;

proc print data=result;
run;

Это сбрасывает «s» для каждой группы «xname» и выводит последнюю запись с «s», установленной на сумму «myvalue» по группе. Результат выглядит так:

Obs    xname     myvalue     s

 1     name01       1        6
 2     name02       4       15
 3     name03       7        7
0 голосов
/ 12 июля 2010

Этот тип задач лучше всего решать с помощью шаблона программирования, известного как DoW (он же цикл Уитлока Do)Для каждой группы инициализация происходит перед циклом, а вывод наблюдения - после цикла.Вы видите, как это действительно работает?Эта бумага старая, но ее нужно прочитать.

data sample;
   input xname$1-6 myvalue;
datalines;    
name01 5
name01 1
name02 3
name02 8
name02 4
name03 7
;
run;

proc sort data=sample;
   by xname;
run;

data result;
   if 0 then set sample; /* prep pdv */
   s = 0;   
   do until (last.xname);
      set sample;
      by xname;
      s + myValue;
   end;
run;

/* check */
proc print data=result;
run;
/* on lst
Obs    xname     myvalue     s

  1     name01       1        6
  2     name02       4       15
  3     name03       7        7
*/
...