将每个观察中的变量值输出到宏变量

时间:2012-01-13 07:22:39

标签: macros sas

我有一个名为* term_table *的表,其中包含以下列

comp,term_type,term,score,rank

我经历了每次观察,并且在每个障碍物中,我想将变量等级的值存储到名为' curr_r'的宏变量中。我在下面创建的代码不起作用

Data Work.term_table;
 input  Comp $
        Term_type $
        Term $
        Score
        Rank
      ;
 datalines;
 comp1 term_type1 A 1 1  
 comp2 term_type2 A 2 10
 comp3 term_type3 A 3 20
 comp4 term_type4 B 4 20
 comp5 term_type5 B 5 40
 comp6 term_type6 B 6 100
 ;
Run;

    %local j;
    DATA tmp;
    SET term_table;
    LENGTH freq 8;

    BY &by_var term_type term;
    RETAIN freq;

    CALL SYMPUT('curr_r', rank);
    IF first.term THEN DO;
        %do j = 1 %to &curr_r;
                         do some thing
                    %end;
    END;
RUN;

你能帮我解决问题吗

非常感谢

1 个答案:

答案 0 :(得分:1)

call symput语句确实创建了具有rank值的宏var& curr_r,但在数据步骤之后它才可用。

但是,我认为您不需要创建宏var& curr_r。我认为根本不需要宏。

我认为以下内容应该有效:(未经测试)

DATA tmp;
 SET term_table;
 LENGTH freq 8;

 BY &by_var term_type term;
 RETAIN freq;

 IF first.term THEN DO;
  do j = 1 to rank;
   <do some thing>
  end;
 END;
RUN;

如果您需要使用先前obs的等级,请使用LAG功能。

Start=Lag(rank);

要将RANK中的每个值存储在一个宏变量中,下面将这样做:

Proc Sql noprint;
 select count(rank)
 into :cnt
 from term_table;

 %Let cnt=&cnt;

 select rank
 into :curr_r1 - :curr_r&cnt
 from term_table;
quit;