2013-10-12 3 views
1

Я попытался использовать макрос и массив, чтобы запаковать кучу переменных по группам (id). мои шаги: 1. лаг все переменные (группы не имеет значения) 2. заменить MIS-отставали клетки путем .Использование макроса и массива для задержки группы переменных в SAS

, но я нашел мой код ошибки и оценить любые предложения.

Вот данные:

data old; 
    input id sale capx profit; 
datalines; 
1 11 111 1111 
1 12 112 1112 
1 13 113 1113 
1 14 114 1114 
1 15 115 1115 
1 16 116 1116 
1 17 117 1117 
2 21 221 2221 
2 22 222 2222 
2 23 223 2223 
3 31 331 3331 
3 32 332 3332 
3 33 333 3333 
3 34 334 3334 
4 41 441 4441 
4 42 442 4442 
4 43 443 4443 
4 44 444 4444 
4 45 445 4445 
4 46 446 4446 
; 
run; 

Код:

data new; 
set old; 
run; 

%macro lag_var(dataset, lag); 
    proc sort data=&dataset;by id; 
    data &dataset; 
    set &dataset; 
    by id; 
    array vs(3) sale capx profit; 
    %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=lag&i(vs(&j)); 

      if first.id then 
      do; 
      count=1; 
      lag&j&i=.; 
      end; 
      count+1; 
      if (not first.id and count<=&i) then 
      do; 
      lag&j&i=.; 
      count+1; 
      end; 
      %end; 
    %end; 
    run; 
%mend lag_var; 

%lag_var(new,5) 

токовый выход (неправильно): enter image description here

Мои ожидаемые результаты: enter image description here

DomPazz» с: enter image description here

+0

Можете ли вы сказать что-то о том, что вы пытаетесь достичь? Это действительно похоже на то, что вы могли/должны делать, используя другой подход. Очевидно, что вы хотите обобщить информацию о последней записи каждой группы - с какой целью? Некоторые из них выглядят детерминированными из ваших данных примера. И ваш подход не похож на то, что он выживет ит с большим количеством наблюдений. – sasfrog

+0

У вас есть доступ к PROC EXPAND? это очень полезно для этих типов сценариев. –

ответ

2

Причина, по которой эти более поздние группы сохраняют свою ценность, заключается в том, что вы находитесь на приращении count.

Я думаю, что это делает то, что вы ищете:

%macro lag_var(dataset, lag); 
    proc sort data=&dataset;by id; 
    data &dataset; 
    set &dataset; 
    by id; 
    array vs(3) sale capx profit; 
    %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=lag&i(vs(&j)); 
      %end; 
    %end; 

    if first.id then do; 
     count=0; 
     %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=.; 
      %end; 
     %end; 
    end; 

    count+1; 

    %do j=1 %to 3; 
     %do i=1 %to &lag; 

      if (not first.id and count<=&i) then do; 
       lag&j&i=.; 
      /*count+1;*/ 
      end; 
     %end; 
    %end; 
    run; 
%mend lag_var; 

EDIT: Изменены инициализацию счетчика от 1 до 0.

+0

Большое спасибо за вашу помощь! Но я думаю, что ваше решение немного отличается от моих ожидаемых результатов (см. Исходный пост). Например, выделенные номера не должны существовать. Я сожалею, что это мой первый макрос SAS ... –

+0

Проблема была в стартовом значении счетчика. Изменено значение 0 вместо 1. Оно должно удалить эти дополнительные значения, проходящие через границу по значению. – DomPazz

Смежные вопросы