在SAS

时间:2015-06-03 14:56:13

标签: sas

我正在尝试创建一个以增量方式构建的哈希变量。我想解决的具体问题是我有一列货币对:

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

我希望第1行的货币对和第2行(美元/英镑)和(英镑/美元)的货币对被识别为相同。所以我试图实现以下算法:

  1. 创建一个空列CurrencyPairRecode
  2. 创建哈希变量declare hash h(); h.defineKey('k'); h.defineData('d');
  3. 对于每一行数据,查找哈希表中是否存在货币对。如果是,则CurrencyPairRecode的值与CurrencyPair

    相同

    rc = h.Check(key:CurrencyPair) IF(rc = 0)那么     CurrencyPairRecode = CurrencyPair

  4. 如果没有,请检查翻转的货币对是否在哈希表中。如果是,则CurrencyPairRecode是翻转值

    CALL CATX(“/”,FLIPPED,SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,4,3),SUBSTR(SETTLEMENT_EXCHANGE_RATE_BASIS,1,3));

    flip_rc = h.Check(key:FLIPPED); IF(flip_rc = 0)那么     CurrencyPairRecode =翻转;

  5. 如果两者都不是,则CurrencyPairRecodeCurrencyPair相同,并将CurrencyPair添加到哈希表中。

    IF(rc ^ = 0 AND flip_rc ^ = 0)那么     h.ADD(关键:CurrencyPair,数据:1);     CurrencyPairRecode = CurrencyPair

  6. 我已经尝试过此代码,但我遇到了错误。我是SAS的新手,所以不确定如何排除故障。感谢所有帮助。

2 个答案:

答案 0 :(得分: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将按字母顺序对变量进行排序,以便您拥有单一货币对。然后,您可以测试其存在并在需要时添加它,而无需进行两次测试。

我还表示一般倾向于使用两个密钥(两种货币)而不是使用单个合并密钥来存储它,但可能有理由不在您的应用程序中执行此操作。根据我的经验,在这样的应用程序中,两个键往往更容易使用。

答案 1 :(得分: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;