SAS对我的宏变量值进行排序

时间:2015-05-26 10:23:52

标签: sas sas-macro

我正在尝试根据不同的货币进行一些计算,其中输出数据集由具有公司名称的列组成,以下列是每种特定货币中每家公司的总和(因此每种货币一个总和列)。我想通过循环使用每种货币进行计算,循环遍历货币列表。 由于某些货币的总和非常小或为0,我想手动指定列/货币在数据集中的显示顺序,因此最大值在第一列中。

我已在数据步骤中按所需顺序列出了货币列表。当我将这些值读入宏变量(使用Proc Sql insert into ...)并使用%put语句查看这些值时,顺序已更改为字母顺序。这会导致计算以错误的顺序完成,从而输出数据集中的列也处于错误的顺序。

有什么方法可以管理列表的顺序和循环通过货币列表的计算,所以它们不是按字母顺序出现,而是按我想要的顺序出现?

 %macro csa;
    data CSA_view;
    set csa;
    %do i=1 %to &number_of_curr;
    %let Curr = %scan(&currency_list, &i);
    keep counterparty mtm_&curr;
    if currency = "&curr" then MTM_&Curr = MTM;
%end;
run;
%mend;
%csa;

2 个答案:

答案 0 :(得分:2)

如果在SQL中没有指定订单,那么您可能会遇到以您不希望的方式出现的风险。如何添加订单变量(然后忽略):

data curr ;
input ordvar currency $ ;
cards ;
1 USD
2 GBP
3 EUR
;run ;

然后您可以像以前一样使用此变量,但订单将按您在临时变量ordvar中指定的任何内容进行排序:

proc sql ;
  select currency
  into :currency_list seperated by ' '
  from curr
  order by ordvar
;quit ;

答案 1 :(得分:1)

另一个简单的选择是使用call symput生成您的列表。数据步骤不会改变订单。

data _null_;
  set your_list end=eof;
  retain big_list;
  length big_list $20000; *make sure this is big enough for your mvar list;
  big_list = catx(' ',big_list,your_Variable);
  if eof then 
    call symputx('mvarname',big_list);
run;