如何循环以从数据集中检索值

时间:2015-01-17 15:36:04

标签: sas

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。 如何循环以从数据集中检索值?谢谢!

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

您只使用两个宏变量来保存4个值。 最简单的方法是使用proc sql(tutorial here)的INTO:语句。

复制并粘贴以下代码以获得我认为您想要的内容:

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;

答案 2 :(得分: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

答案 3 :(得分:0)

我找到了解决方案。 sas macro getvalue