在SAS中使用Do时无限循环

时间:2015-05-28 13:20:27

标签: sas

我很新但很想学习SAS编码。我有2个数据集a和b,即dt1和dt2,它们包括dt1和b的列a和dt2的c:

a      b      c
2014   2008   2
       2009   3
       2014   4 
       2015   5

当我在b列的第n行的元素等于a(1)时,我试图得到c列的第n行 这是c = 4; 我在下面写了一段代码。

DATA dt1;
   set dt1;
data dt2;
   set dt2;
   i=1;
   do while (b ne a);
      i=i+1;
   end;
   call symput('ROW_NUMBER',i);
run;

proc print data = dt2(keep = c obs = &ROW_NUMBER firstobs = &ROW_NUMBER);
run;

但是此代码进入无限循环,我找不到任何解决方案。如果您帮助解决此问题,我将不胜感激。 感谢

3 个答案:

答案 0 :(得分:2)

我认为在尝试使用宏变量之前,您应该学习数据步骤的基本语法。很多你正在做的事情没什么意义。以下是对how the data step works的解释。如果你研究那个,你会为自己做一个巨大的帮助。

以下是如何在proc sql中进行内部联接,这似乎更符合您的目标。这只是选择c的值,其中dt1.a等于dt2.b:

proc sql;
select c
from dt1 inner join dt2 on dt1.a = dt2.b;
quit;

如果您要使用数据步骤,则可以执行以下操作:

data out(keep=c);
  set dt1;
  do until (a=b or eof);
    set dt2 end=eof;
    if a=b then output;
  end;
run;
proc print data=out noobs;
run;

使用end=选项创建临时变量eof,允许您在读取最后一行dt2后结束循环。

答案 1 :(得分:2)

这是一个简单的MERGE。您只需要重命名变量以匹配。这假设它们都按值(a / b)排序。然后,您可以在该数据步骤中设置宏变量或执行您想要的任何操作。

data want;
  merge dt1(in=_a rename=a=b) dt2(in=_b);
  by b;
  if _a and _b;
  call symput("ROW_NUMBER",c);
run;

答案 2 :(得分:0)

如果要定义宏变量:

data _null_;
set dt2;
if _n_=1 then set dt1;
if a=b then do;
call symput('c_val',c); 
call symput('row_num',_n_);
end;
run;

%put &row_num &c_val;