Macros 将每次观察中的变量值导出到宏变量

Macros 将每次观察中的变量值导出到宏变量,macros,sas,Macros,Sas,我有一个名为term\u table的表,其中包含以下列 comp,术语类型,术语,得分,排名 我通过每次观察,在每次obs中,我想将变量秩的值存储到一个名为curr\r的宏变量中。我在下面创建的代码不起作用 Data Work.term_table; input Comp $ Term_type $ Term $ Score Rank ; datalines; comp1 term_type1 A 1 1

我有一个名为
term\u table
的表,其中包含以下列

comp
术语类型
术语
得分
排名

我通过每次观察,在每次obs中,我想将变量秩的值存储到一个名为
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;
你能帮我解决这个问题吗

非常感谢


挂起

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

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

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

要将秩的每个值存储在宏变量中,请执行以下操作:

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;

call symput语句使用rank值创建宏var&curr\r,但在数据步骤之后才可用

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

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

要将秩的每个值存储在宏变量中,请执行以下操作:

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;

非常感谢。在术语表中,假设术语“A”有3个秩值:1、10、20。现在假设我在obs term=A,秩=10。我需要做一个循环:“doj=2到10”。如果我在term=A,rank=20,我需要做一个循环:“Do j=11至20)。这意味着我应该在每个obs上存储上一个列组和当前列组来执行循环。你能给我一些建议吗。HungHi,是的,最后我发现我不需要宏变量来解决我的问题。非常感谢您的帮助…我用一些示例数据更新了您的答案,如有必要,请进行更改。把你的附加问题添加到你的原始问题中,这样会使答案有意义。示例数据使帮助更容易…非常感谢。在术语表中,假设术语“A”有3个秩值:1、10、20。现在假设我在obs term=A,秩=10。我需要做一个循环:“doj=2到10”。如果我在term=A,rank=20,我需要做一个循环:“Do j=11至20)。这意味着我应该在每个obs上存储上一个列组和当前列组来执行循环。你能给我一些建议吗。HungHi,是的,最后我发现我不需要宏变量来解决我的问题。非常感谢您的帮助…我用一些示例数据更新了您的答案,如有必要,请进行更改。把你的附加问题添加到你的原始问题中,这样会使答案有意义。示例数据使帮助更容易。。。
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;