我有一个名为* 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;
你能帮我解决问题吗
非常感谢
红
答案 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;