如何将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;