Как зациклить для извлечения значений из набора данных

data aaa;
input x y;
cards;
1 2
3 4
;
run;

%macro aaa;
data _null_;
  set aaa;
  do i=1 to 2;
    if _N_ =i then do;
        call symput('Value',x);
        call symput('TagValue',y);
        %put &value;
        %put &tagvalue;
    end;
  end;
run;
%mend;
%aaa;

Результаты были 3 4, а не 1 2 3 4. Как выполнить цикл для извлечения значений из набора данных? Благодарю вас!


sas
person stata    schedule 17.01.2015    source источник
comment
Пожалуйста, уточните, что вы ожидаете. Должен ли &Value быть 1 3, а &TagValue должен быть 2 4? Ожидаете ли вы, что &Value и &TagValue будут массивами (что невозможно, но вы можете создать &Value1, &Value2 &TagValue1 и &TagValue2, а затем написать %do suffix = 1 %to 2; blabla; %end;)? Возможно, вы должны объяснить нам, что вы хотите делать с ними потом.   -  person Dirk Horsten    schedule 18.01.2015


Ответы (4)


Как правило, макропеременные недоступны до завершения шага данных, поэтому доступны только последние значения.

Вы можете использовать функцию разрешения, чтобы обойти это, но это зависит от того, что вы пытаетесь сделать в целом.

%macro aaa;
data _null_;
  set aaa;
  do i=1 to 2;
    if _N_ =i then do;
        call symput('Value',x);
        call symput('TagValue',y);

        x=resolve('&Value');
        y=resolve('&TagValue');

        put x;
        put y;
    end;
  end;
run;
%mend;
%aaa;
person Reeza    schedule 17.01.2015


data aaa;
  input x y;
cards;
1 2
3 4
;
run;

%macro aaa;
data _null_;
  set aaa;
  macroVar = 'Value'||put(_N_,1.);
  call symput(macroVar,x);
  macroVar = 'TagValue'||put(_N_,1.);
  call symput(macroVar,y);
run;

%do sufx=1 %to 2;
  %put Value&sufx is &&Value&sufx;
  %put TagValue&sufx is &&TagValue&sufx;
%mend;

%aaa;

приведет к

Value1 is 1;
TagValue1 is 2;
Value2 is 3;
TagValue2 is 4;

Если ваш суффикс превышает 9, вам нужно будет написать macroVar = 'Value'||strip(put(_N_,8.)); См. также http://www2.sas.com/proceedings/sugi22/CODERS/PAPER77.PDF

person Dirk Horsten    schedule 18.01.2015

Я нашел решение. макрос sas getvalue

person stata    schedule 19.01.2015