我使用:
创建一个marco数组proc sql;
select distinct variable into:numVarList separated by ' ' from Map_num;
我用过:
%put &numVarList{1};
它给了我所有变量:var1 var2 var3{1}
如何使用索引来挑选宏数组变量?
更新20180305 很奇怪
%put &numVarList.;
然后我得到了:年龄agenc_non_ccbt_fnd_bal chmtpd_tmpnt_bal crnyr_cnter_tdnum
%put %sysnc(scan(&numVarList.,1,str( )));
我得到了:年龄agnc_non_ccb
为什么?以及如何解决它?
答案 0 :(得分:3)
您不使用select创建数组。结果只是一个字符串:var1 var2 var3
但是,您可以使用scan
- 函数访问每个元素:
%let first_ele = %scan(&numVarList.,1,%str( ));
结果是:var1
你也可以像这样循环你的字符串:
%do i=1 %to %sysfunc(countw(&numVarList.,%str( )));
%put %scan(&numVarList.,&i.,%str( ));
%end;
答案 1 :(得分:1)
proc sql;
select distinct variable into:numVarList separated by ' ' from Map_num;
使用值填充单个宏变量,该值可以解释为列表,该列表是名为“variable”的列中的不同值的串联。
对于这样的列表,您将扫描出@zuluk所示的各个项目。
在原始值是变量名称的情况下,串联的解析可以直接用作接受变量名称列表的SAS语句的一部分,例如Proc PRINT; VAR &numVarList
或DATA _NULL_; ARRAY v &numVarList
< / p>
概念宏数组只是一组宏变量(当太多'变量'想法发生碰撞时可以被认为是'符号')具有公共基名和增加数字后缀。通过在Proc SQL
中使用略有不同的语法来创建这样一组宏变量。
select distinct variable
into :symbol1-:symbol9999
from Map_num
9999表示您不希望超过的大数字。如果数据具有N <= 9999行,则将仅创建N宏变量。如果N> 9999行仅创建9999个宏变量。警告:太多宏变量可能会填满宏符号表并导致SAS出错。对我来说,宏数组更像是一种编程概念,而不是编程结构。
例如
Proc SQL noprint;
select name into :name1-:name9999 from sashelp.class;
%let name_count = &sqlobs;
quit;
%put NOTE: &=name1;
%put NOTE: &=name2;
%put NOTE: name&name_count=%superq(name&name_count); * almost same as next;
%put NOTE: name&name_count=&&name&name_count; * almost same as prev;
当以1级抽象方式处理宏数组的“名称”时,通过编写“棘手的三重帽”&&&
%macro log_macroArray (basename);
%local i count_symbol value_symbol;
%let count_symbol = &basename._count;
%do i = 1 %to &&&count_symbol;
%let value_symbol = &basename.&i;
%put NOTE: &value_symbol=&&&value_symbol;
%end;
%mend;
%log_macroArray(name);
SAS宏系统在其值解析阶段内部“循环”,并在内部评估的每一步将状态折叠为&&
到&
。
答案 2 :(得分:0)
在@ zuluk的回答基础上,您不能使用运算符(如table %>% group_by(name) %>%
filter("abc" %in% code & "xyz" %in% code & (code == "abc" | code == "xyz"))
# A tibble: 4 x 3
# Groups: name [2]
name total code
<fct> <dbl> <fct>
1 Jeff 123 abc
2 Jeff 234 xyz
3 Jill 345 abc
4 Jill 456 xyz
)来访问宏&#34;数组&#34;因为它不是语言的一部分,并且不可能在SAS中重载运算符......主要是...但你可以轻松地做一个函数式宏。
{ }
这非常接近你正在寻找的东西,只是语法不完全相同。如果你想构建新的变量/ etc,你也可以通过宏来实现,尽管编写一般宏可能会更复杂,因为有很多方法你可能想要这样做。这是一个非功能风格的版本。
proc sql;
select name into :namelist separated by ' '
from sashelp.class;
quit;
%macro marray(list, n);
%scan(&list.,&n.)
%mend marray;
%put %marray(&namelist,2);