【问题标题】:SAS sorts my macro variable valuesSAS 对我的宏变量值进行排序
【发布时间】:2015-05-26 10:23:52
【问题描述】:

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

我在数据步骤中按所需顺序制作了货币列表。当我将这些值读入宏变量(使用 Proc Sql 插入...)并使用 %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;

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    如果在 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 ;
    

    【讨论】:

    • 这样一个简单的解决方案。谢谢
    【解决方案2】:

    另一个简单的选择是使用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;
    

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多