我很新但很想学习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;
但是此代码进入无限循环,我找不到任何解决方案。如果您帮助解决此问题,我将不胜感激。 感谢
答案 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;