2015-06-03 47 views
1

我正在嘗試創建一個增量構建的散列變量。我試圖解決的具體問題是,我有貨幣對的一列:在SAS中構建和使用增量散列變量

|--------------------| 
| ID | CurrencyPair | 
|----|---------------| 
| 1 | USD/GBP  | 
| 2 | GBP/USD  | 
| 3 | USD/BRL  | 
| ...| ...   | 

我想爲行1和貨幣對第2行貨幣對(USD/GBP)和(GBP/USD)到被認爲是一樣的。所以我想實現如下算法:

  1. 創建一個空列CurrencyPairRecode
  2. 創建一個散列變量declare hash h(); h.defineKey('k'); h.defineData('d');
  3. 對於數據的每一行,查找是否在哈希表中存在的貨幣對。如果是這樣的CurrencyPairRecode值相同CurrencyPair

    RC = h.Check(標號:CurrencyPair) IF(RC = 0)THEN CurrencyPairRecode = CurrencyPair

  4. 如果沒有,檢查是否翻轉貨幣對在哈希表中。如果是,CurrencyPairRecode是翻轉值

    CALL CATX( 「/」,翻轉SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,4,3),SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,1,3));

    flip_rc = h.Check(key:FLIPPED); IF(flip_rc = 0)THEN CurrencyPairRecode =翻轉;

  5. 如果兩者都不相同,則CurrencyPairRecodeCurrencyPair相同並將CurrencyPair添加到散列表。 (key:CurrencyPair,data:1);如果(rc^= 0 AND flip_rc^= 0)則返回 。 CurrencyPairRecode = CurrencyPair

我已經試過這段代碼,但得到錯誤。我對SAS完全陌生,所以不確定如何排除故障。所有的幫助表示讚賞。

+0

存儲在一個單一變量的貨幣對,或者在一對變量? – Joe

回答

3

我使用的一般方法是以始終排序的順序存儲貨幣對。當訂單確實不相關時,這是特別有吸引力的(因爲您不必跟蹤它)。

我會做這樣的事情。

data have; 
    input ID CurrencyPair $; 
    datalines; 
1 USD/GBP 
2 GBP/USD 
3 USD/BRL 
;;;; 
run; 

data for_hash; 
    set have; 
    array curs[2] $ _temporary_; 
    curs[1] = scan(currencyPair,1,'/'); 
    curs[2] = scan(currencyPair,2,'/'); 
    call sortc(of curs[*]); 
    new_pair = catx('/',of curs[*]); 
    put _all_; 
run; 

然後,您可以在同一個datastep中加載散列。使用call sortc將按字母順序排列變量,以便您擁有單一貨幣對。然後您可以測試它的存在並在需要時添加它,而無需進行兩次測試。

我也會表示一般的優先選擇是用兩個鍵(兩種貨幣)來存儲它,而不是用一個合併的鍵,但在你的應用程序中可能有這樣做的原因。根據我的經驗,兩個按鍵往往更容易在這樣的應用程序中使用。

0

如果我正確理解你的問題,也許你可以試試這個:

data want; 
    if _n_=1 then do; 
     declare hash h(); 
     h.definekey('CurrencyPair'); 
     h.definedata('CurrencyPair'); 
     h.definedone(); 
    end; 
    set have; 
    _CurrencyPair=prxchange('s/(.*)\/(.*)/$2\/$1/',-1,strip(CurrencyPair)); 
    rc1=h.check(); 
    rc2=h.check(key:_CurrencyPair); 
    if rc1^=0 and rc2^=0 then do; 
     h.add(); 
     CurrencyPairRecode = CurrencyPair; 
    end; 
    else if rc1^=0 and rc2=0 then do; 
     h.add(); 
     CurrencyPairRecode =_CurrencyPair; 
    end; 
    else if rc1=0 then CurrencyPairRecode = CurrencyPair; 
drop rc: _:; 
run;