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

标签 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;

最佳答案

当 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 ;

关于SAS 对我的宏变量值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455825/

相关文章:

sas - 如何在更新宏变量的数据步骤中调用宏并立即使用该值?

SAS:将分位数分配给宏变量

SAS 如何使用宏变量作为日期

sas - 在SAS中单独解析标题行

sql - 在SQL语句中执行宏

sas - 如何调用 SAS 中另一个变量下的字符串变量?

xml - 从 XML 读入多个 SAS 表

recursion - 在 SAS 中实现递归二分

excel - 为什么 ODS Excel 自动筛选器禁用生成的工作簿中的筛选器?