在Proc IML中执行loop和If语句

时间:2014-07-17 02:23:16

标签: sas sas-iml

我有一个包含一列(城市)的table1,我有一个第二个表(table2),它有两列(城市,距离),

我正在尝试创建第三个表,表3,此表包含两列(城市,距离),表3中的城市将来自table1中的城市列,距离将是table2中的相应距离。

enter image description here

我尝试使用基于Joe的建议的Proc IML这样做,这就是我所拥有的。

proc iml;

use Table1;

read all var _CHAR_ into Var2 ;


use Table2;
read all var _NUM_ into Var4;
read all var _CHAR_ into Var5;


do i=1 to nrow(Var2);
   do  j=1 to nrow(Var5);
    if Var2[i,1] = Var5[j,1] then
    x[i] = Var4[i];
end;


create Table3 from x;
append from x;
close Table3 ; 
quit;

我收到错误,矩阵x尚未设置为值。有人可以帮帮我吗提前谢谢。

2 个答案:

答案 0 :(得分:4)

您要使用的技术称为"unique-loc technique"。它使您能够循环分类变量的唯一值(在本例中为唯一城市)并为每个值执行某些操作(在这种情况下,将距离复制到另一个数组中)。

所以其他人可以重新提出这个想法,我已经将数据直接嵌入到程序中:

T1_City = {"Gould","Boise City","Felt","Gould","Gould"};
T2_City = {"Gould","Boise City","Felt"};
T2_Dist = {10, 15, 12};

T1_Dist = j(nrow(T1_City),1,.);    /* allocate vector for results */
do i = 1 to nrow(T2_City);
   idx = loc(T1_City = T2_City[i]);
   if ncol(idx)>0 then 
      T1_Dist[idx] = T2_Dist[i];
end;

print T1_City T1_Dist;

IF-THEN语句用于防止Table2中的城市不在Table1中。你可以阅读why it is important to use that IF-THEN statement。如果Table2包含Table1城市的所有唯一元素,则不需要IF-THEN语句。

我的书Statistical Programming with SAS/IML Software中讨论并广泛使用了这种技术。

答案 1 :(得分:0)

您需要一个嵌套循环,或者使用在另一个矩阵中查找值的函数。

IE:

do i = 1 to nrow(table1);
  do j = 1 to nrow(table2);
...
  end;
end;