如何将SAS宏与%DO和%IF一起使用
当我运行宏时,如何将SAS宏与%DO和%IF一起使用,sas,sas-macro,Sas,Sas Macro,当我运行宏时,PassengerID_类有一个空值 我认为下面的句子有问题 %如果PassengerID>=&p&i和PassengerID=&P&i和PassengerID
PassengerID_类
有一个空值
我认为下面的句子有问题
%如果PassengerID>=&p&i和PassengerID<&p&k%,则PassengerID_Class=&i代码>
PassengerID
是一列,包含从1
到891
的值
P1
,P2
,…,Pi
是分位数
下面是我的代码
%macro do_loop;
DATA _NULL_;
SET PERCENTILES100_Transpose;
call symput("P"||left(_n_),Column1);
RUN;
Data Groups100;
Set sample;
%do i=2 %to 99;
%Let k = %eval(&i.+1);
%if PassengerID >= &&P&i and PassengerID < &&P&k %then PassengerID_Class = &i. ;
%end;
%mend;
%do_loop;
%宏执行循环;
数据为空;
设置百分位数100_转置;
调用symput(“P”| | left(_n|),第1列;
跑
数据组100;
设定样本;
%i=2%至99;
%设k=%eval(&i.+1);
%如果PassengerID>=&P&i和PassengerID<&P&k%,则PassengerID_Class=&i;
%结束;
%修补;
%做循环;
不能使用宏表达式测试数据集变量的值。只需使用宏生成正常的IF语句,就像使用宏生成数据和其他SAS语句一样
if &&P&i <= PassengerID < &&P&k then PassengerID_Class = &i. ;
if&P&i 0);
如果要测试实际变量的值,为什么要使用宏%if
?使用IF语句。如果您想将数据分割成分位数,PROC-RANK将在单个PROC中完成<代码>过程等级数据=sashelp.class out=等级组=2;变量权重;等级权重(u)等级;;运行代码>。不需要多个步骤、合并等。更改组=10表示十分位数。多亏了你,我解决了这个问题。这真的帮了大忙。非常感谢。
data Groups100;
set sample;
array p[100] _temporary_;
if _n_=1 then do index=1 by 1 until(eof);
set PERCENTILES100_Transpose(keep=column1) end=eof;
p[index]=column1;
end;
PassengerID_Class=0;
do index=2 to 99 until(PassengerID_Class>0);
if p[index] <= PassengerID < p[index+1] then PassengerID_Class = index ;
end;
drop index column1 ;
run;