Sas Proc IML中的Do循环和If语句

Sas Proc IML中的Do循环和If语句,sas,sas-iml,Sas,Sas Iml,我的表1包含一列(城市),第二个表(表2)包含两列(城市,距离) 我试图创建第三个表,表3,该表包含两列(城市,距离),表3中的城市将来自表1中的城市列,距离将是表2中相应的距离 我根据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_ in

我的表1包含一列(城市),第二个表(表2)包含两列(城市,距离)

我试图创建第三个表,表3,该表包含两列(城市,距离),表3中的城市将来自表1中的城市列,距离将是表2中相应的距离

我根据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没有被设置为一个值。谁能帮我一下吗。提前感谢。

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

即:


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

即:


您要使用的技术称为。它使您能够循环遍历分类变量的唯一值(在本例中为唯一城市),并对每个值执行某些操作(在本例中,将距离复制到另一个数组中)

为了让其他人能够重新解释这个想法,我将数据直接嵌入到程序中:

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声明是为了防止表2中的城市不在表1中。你可以读到。如果表2包含表1城市的所有独特元素,则不需要IF-THEN语句


这项技术在我的书中被广泛讨论和使用。

您想要使用的技术被称为。它使您能够循环遍历分类变量的唯一值(在本例中为唯一城市),并对每个值执行某些操作(在本例中,将距离复制到另一个数组中)

为了让其他人能够重新解释这个想法,我将数据直接嵌入到程序中:

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声明是为了防止表2中的城市不在表1中。你可以读到。如果表2包含表1城市的所有独特元素,则不需要IF-THEN语句


这项技术在我的书中被广泛讨论和使用。

当你提到nexted do循环时,我了解了全局,我完全混淆了内循环和外循环的条件语句。当你提到nexted do循环时,我了解了全局,我把内部循环和外部循环的条件语句搞混了。啊,就是这样。这是我知道如何在R中做的事情之一,但我记不起IML的等价物是什么。啊,就是这样。这是我知道如何在R中做的事情之一,但我记不起IML的等价物是什么。