วิธีวนซ้ำเพื่อดึงค่าจากชุดข้อมูล

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 มาโครรับค่า

person stata    schedule 19.01.2015