2015-01-17 2 views
0
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. Как петли для извлечения значений из набора данных? Спасибо!цикл для извлечения значений из набора данных

+0

Просьба уточнить, что вы ожидаете. Должны ли '& Value' быть' 1 3' и '& TagValue' быть' 2 4'? Вы ожидаете, что '& Value' и' & TagValue' будут массивами (что невозможно, но вы можете создавать '& Value1',' & Value2'' & TagValue1' и '& TagValue2', а затем писать'% do suffix = 1% to 2; blabla;% end; ')? Вероятно, вы должны объяснить нам, что вы хотите с ними делать потом. –

ответ

0

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

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

%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; 
0

Вы используете только две макропеременные, чтобы сохранить 4 значения. Самый простой способ сделать это - использовать инструкцию INTO: proc sql (tutorial here).

Скопируйте и вставьте следующий код, чтобы получить то, что я верю, что вы хотите:

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

proc sql noprint; 
    select x,y into:value1-:value2, :tagValue1 - :tagValue2 
    from aaa; 
quit; 

%macro print_macro_variables; 
    %put value - tagvalue; 
    %put 1: &value1 - &tagValue1; 
    %put 2: &value2 - &tagValue2; 
%mend; 
0
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

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