Cara mengulang untuk mengambil nilai dari kumpulan data

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;

Hasilnya adalah 3 4, bukan 1 2 3 4. Bagaimana cara mengulang untuk mengambil nilai dari kumpulan data? Terima kasih!


sas
person stata    schedule 17.01.2015    source sumber
comment
Harap jelaskan apa yang Anda harapkan. Haruskah &Value menjadi 1 3 dan &TagValue menjadi 2 4? Apakah Anda mengharapkan &Value dan &TagValue menjadi array (yang tidak mungkin, tetapi Anda dapat membuat &Value1, &Value2 &TagValue1 dan &TagValue2 lalu menulis %do suffix = 1 %to 2; blabla; %end;)? Mungkin Anda harus menjelaskan kepada kami apa yang ingin Anda lakukan dengan mereka setelahnya.   -  person Dirk Horsten    schedule 18.01.2015


Jawaban (4)


Secara umum, variabel makro tidak tersedia hingga langkah data selesai sehingga hanya nilai terakhir yang tersedia.

Anda dapat menggunakan fungsi tekad untuk menyiasatinya, namun hal ini bergantung pada apa yang ingin Anda lakukan secara keseluruhan.

%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

Anda hanya menggunakan dua variabel makro untuk menyimpan 4 nilai. Cara termudah untuk melakukan ini adalah menggunakan INTO: pernyataan proc sql(tutorial di sini).

Salin dan tempel kode berikut untuk mendapatkan apa yang saya yakin Anda inginkan:

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;
person jaamor    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;

akan menghasilkan

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

Jika akhiran Anda melebihi 9, Anda harus menulis macroVar = 'Value'||strip(put(_N_,8.)); Lihat juga http://www2.sas.com/proceedings/sugi22/CODERS/PAPER77.PDF

person Dirk Horsten    schedule 18.01.2015

Saya telah menemukan solusinya. sebagai getvalue makro

person stata    schedule 19.01.2015