2012-01-13 80 views
1

我有一个名为* term_table *包含下面列在每个观测变量的值脱身宏变量

补偿,term_type,期限,评分表,排名

我去通过每个观察和每个obs,我想将变量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

呼叫symput语句也创建宏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功能。很多

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; 
+0

感谢:

Start=Lag(rank); 

排名的每个值存储在宏变量,下面将这样做。在term_table中,假设术语'A'具有RANK的3个值:1,10,20。现在假定我处于obs term = A和rank = 10。我需要做一个循环:“做J = 2到10”。如果我的学期= A,等级= 20,我需要做一个循环:“Do j = 11 to 20)。这意味着我应该存储前一个等级和每个obs的当前等级来完成循环。我有任何建议Hung – 2012-01-13 13:13:02

+0

嗨,是的,最后我发现我不需要宏变量来解决我的问题,谢谢了很多 – 2012-01-13 13:31:46

+1

很高兴帮助...我用一些示例数据更新了答案,如果需要的话更改。您的原始附加问题,它会使答案变得有意义。示例数据使得它更容易帮助... – 2012-01-13 14:41:30