2015-09-24 45 views
0

我需要從表中加載一個2d數組到SAS數據步驟,然後用它在另一個表中執行變量轉換。該陣列看起來是這樣的:sas從表中加載數組

  • 行:initial_value 1-4
  • 列:今年1 - 4

1 1 2 3 2 2 2 3 3 4 4 4 4 4 5 6

到目前爲止,我硬編碼的數組SAS代碼: data example; array lookup {4,4} _temporary_ 1 1 2 3 2 2 2 3 3 4 4 4 4 4 5 6 ; set source(keep=(value years)); value_final = lookup{value, years}; run;

如何在不硬化矩陣的情況下做同樣的事情,而是將表加載到數據步驟中並使用數組?

+0

如果您正在使用矩陣,那麼您可能需要查看'proc iml'。裏克威克林在他的博客上有一些很棒的例子(http://blogs.sas.com/content/iml/)。或者,查看哈希表。在附註中,您可能需要準確描述您計劃如何進行轉換(以便人們可以更有幫助),或簡化您的問題,以瞭解如何將表加載到多維數組中。 –

+0

謝謝,這是一個相當無趣的案例 - 我只需要一個簡單的查找數組。我剛剛提出的一個解決方案是將數組轉換爲每一對年份和初始值的列表形式 - 值,然後進行連接。可能會回答我自己的問題,但我仍然很好奇,如果可以在數據步驟中從表中加載數組:) –

+0

聲音像散列表可能是當時的「標準」方式。 –

回答

1

我會將查找表放入具有年份和值的數據集中。然後將其加載到關聯數組中。

data lookup; 
    do value = 1 to 4; 
     do years = 1 to 4; 
     input value_final @; 
     output; 
     end; 
     end; 
    cards; 
1 1 2 3 
2 2 2 3 
3 4 4 4 
4 4 5 6 
;;;; 
    run; 
proc print; 
    run; 
data source; 
    input years value @@; 
    cards; 
3 2 4 1 5 0 2 2 
;;;; 
    run; 

data example; 
    if _n_ eq 1 then do; 
     if 0 then set lookup; 
     declare hash lookup(dataset:'lookup'); 
     lookup.definekey('value','years'); 
     lookup.definedata('value_final'); 
     lookup.definedone(); 
     end; 
    set source; 
    if lookup.find() ne 0 then call missing(value_final); 
    run; 
proc print; 
    run; 

你可以加載到數組中,但它有點笨重,你必須知道維數。而且你必須檢查我沒有做的範圍之外的下標。

data lookup; 
    do value = 1 to 4; 
     do years = 1 to 4; 
     input value_final @; 
     output; 
     end; 
     end; 
    cards; 
1 1 2 3 
2 2 2 3 
3 4 4 4 
4 4 5 6 
;;;; 
    run; 
proc print; 
    run; 
data source; 
    input years value @@; 
    cards; 
3 2 4 1 2 2 
;;;; 
    run; 

data example; 
    array lookup[4,4] _temporary_; 
    if _n_ eq 1 then do; 
     do while(not eof); 
     set lookup end=eof; 
     lookup[value,years]=value_final; 
     end; 
     end; 
    set source; 
    value_final=lookup[value,years]; 
    run; 
proc print; 
    run; 
+0

完美,這正是我需要的:)和查找表的一段有趣的代碼。絕對需要查找哈希表的功能。 –