【问题标题】:Get out the value of a variable in each observation to a macro variable将每次观察中的变量值取出到宏变量中
【发布时间】:2012-02-09 10:57:26
【问题描述】:

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

compterm_typetermscorerank

我经过每一次观察,在每一次观测中,我想将变量 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;

你能帮我解决这个问题吗

非常感谢

挂了

【问题讨论】:

    标签: macros sas


    【解决方案1】:

    调用 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;
    

    【讨论】:

    • 非常感谢。在 term_table 中,假设术语“A”具有 3 个 RANK 值:1、10、20。现在假设我在 obs term=A 和 rank=10。我需要做一个循环:“做 J=2 到 10”。如果我在 term=A, rank = 20 我需要做一个循环:“Do j=11 TO 20)。这意味着我应该在每个 obs 存储上一个排名和当前排名来做循环。你能给我有什么建议。挂了
    • 嗨,是的,最后我发现我不需要宏变量来解决我的问题。非常感谢
    • 很高兴为您提供帮助...我用一些示例数据更新了您的答案,如有必要进行更改。将您的附加问题添加到您的原始问题中,这将使答案有意义。示例数据更容易帮助...
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多