在SAS中构建和使用增量散列变量

  • 本文关键字:变量 SAS 构建 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: currencyair)如果(rc=0)则CurrencyPairRecode = CurrencyPair

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

    CALL CATX("/",翻转,SUBSTR(settment_exchange_rate_basis, 4,3),SUBSTR(settment_exchange_rate_basis, 1,3));

    flip_rc = h.Check(key: FLIPPED);IF (flip_rc = 0) THENcurrencyairrecode = flipped;

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

    IF (rc^=0 AND flip_rc^= 0) THENadd (key: currencyair, data: 1);CurrencyPairRecode = CurrencyPair

我已经尝试过这个代码,但得到错误。我是SAS的新手,所以不知道如何排除故障。

我使用的一般方法是始终按排序顺序存储货币对。当顺序真的不相关时(因为你不需要跟踪它),这一点特别有吸引力。

我会这样做。

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;

然后可以在相同的数据步骤中加载哈希值。使用call sortc将按字母顺序对变量排序,这样您就有了一个单一的货币对。然后,您可以测试它的存在并在需要时添加它,而无需进行两次测试。

我还倾向于使用两个密钥(两种货币)来存储它,而不是使用单个合并的密钥,但是在您的应用程序中可能有不这样做的原因。根据我的经验,在这样的应用程序中,有两个键更容易使用。

如果我正确理解了你的问题,也许你可以试试这个:

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;

最新更新