SAS 对我的宏变量值进行排序
SAS sorts my macro variable values
我正在尝试根据不同的货币进行一些计算,其中输出数据集包含一个包含公司名称的列,以下列是每个公司以每种特定货币表示的总和(因此每种货币一个总和列) .我想通过使用每种货币的循环进行计算,循环遍历货币列表。
由于某些货币的总和非常小或为 0,我想手动指定 columns/currencies 在数据集中出现的顺序,因此最大值在第一列中。
我已经在数据步骤中按所需顺序制作了货币列表。当我将这些值读入宏变量(使用 Proc Sql insert into...)并使用 %put 语句查看这些值时,顺序已更改为字母顺序。这会导致计算以错误的顺序进行,因此输出数据集中的列的顺序也是错误的。
有什么方法可以管理列表的顺序和货币列表的循环计算,使它们不按字母顺序出现,而是按我想要的顺序出现?
%macro csa;
data CSA_view;
set csa;
%do i=1 %to &number_of_curr;
%let Curr = %scan(¤cy_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 ;
另一个简单的选择是使用 call symput
生成列表。数据步骤不会更改顺序。
data _null_;
set your_list end=eof;
retain big_list;
length big_list 000; *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;
我正在尝试根据不同的货币进行一些计算,其中输出数据集包含一个包含公司名称的列,以下列是每个公司以每种特定货币表示的总和(因此每种货币一个总和列) .我想通过使用每种货币的循环进行计算,循环遍历货币列表。 由于某些货币的总和非常小或为 0,我想手动指定 columns/currencies 在数据集中出现的顺序,因此最大值在第一列中。
我已经在数据步骤中按所需顺序制作了货币列表。当我将这些值读入宏变量(使用 Proc Sql insert into...)并使用 %put 语句查看这些值时,顺序已更改为字母顺序。这会导致计算以错误的顺序进行,因此输出数据集中的列的顺序也是错误的。
有什么方法可以管理列表的顺序和货币列表的循环计算,使它们不按字母顺序出现,而是按我想要的顺序出现?
%macro csa;
data CSA_view;
set csa;
%do i=1 %to &number_of_curr;
%let Curr = %scan(¤cy_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 ;
另一个简单的选择是使用 call symput
生成列表。数据步骤不会更改顺序。
data _null_;
set your_list end=eof;
retain big_list;
length big_list 000; *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;