2014-07-17 80 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