2014-07-17 42 views
1

我有一个包含一列(市)表1,我有第二个表(表2),有两列(市,距离),Do循环和if语句在PROC IML

我想创建一个第三表,表3,该表包含两列(城市,距离),表3中的城市将来自表1中的城市列,距离将成为表2中的对应距离。

enter image description here

我想这样做基于乔的建议,这一点使用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没有被设置为一个值。有人可以帮我在这里。提前致谢。

回答

0

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

IE:

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

当你提到nexted做循环时,我得到了一个大局,我将所有与条件语句混淆在内部循环和内部循环之外。 – bison2178

4

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

以便其他人可以reprodce的想法,我已经直接嵌入的数据到程序:

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城市。你可以阅读约why it is important to use that IF-THEN statement。如果Table2包含Table1城市的所有独特元素,则不需要IF-THEN语句。

该技术在我的书Statistical Programming with SAS/IML Software中被广泛讨论和使用。

+0

啊,就是这样。这是我知道如何在R中做的事情之一,但不记得IML等价物是什么。 – Joe

+0

@瑞克,真棒。这工作。谢谢瑞克,谢谢乔 – bison2178