如何在宏SAS中访问循环中数组的第n个元素?
我试图在宏定义中获取%do循环内数组的第I项,并创建一个具有元素名称的数据集,但我所能得到的只是类似“z1”等的内容。这就是我目前得到的结果如何在宏SAS中访问循环中数组的第n个元素?,sas,Sas,我试图在宏定义中获取%do循环内数组的第I项,并创建一个具有元素名称的数据集,但我所能得到的只是类似“z1”等的内容。这就是我目前得到的结果 %macro print(set,groupvar); proc sql ; select put(count(distinct &groupvar),1.) into :hm from &set ; select distinct set into :z1-:z&sysmaxlong from &am
%macro print(set,groupvar);
proc sql ;
select put(count(distinct &groupvar),1.)
into :hm
from &set
;
select distinct set
into :z1-:z&sysmaxlong
from &set
;
quit;
data %do i =1 %to &hm;
%scan(&z, &i);
%end;
;
%mend;
我也尝试了z[&I]而不是%scan(&z,&I)
,但仍然没有运气问题:
select distinct set
select distinct &set into :z1- from &set; quit;
output
语句不能指定动态目标表。您需要创建墙纸代码,以便根据拆分条件输出到相应的表中
您的宏需要创建宏变量以支持此代码模板
data &out1 &out2 … &outN;
set input_data;
select;
when (&case1) output &out1;
when (&case2) output &out2;
…
when (&caseN) output &outN;
otherwise;
end;
run;
data &outlist;
set input_data;
select;
&whenStatements;
otherwise;
end;
run;
一些巧妙的SQL可以支持该模板
data &out1 &out2 … &outN;
set input_data;
select;
when (&case1) output &out1;
when (&case2) output &out2;
…
when (&caseN) output &outN;
otherwise;
end;
run;
data &outlist;
set input_data;
select;
&whenStatements;
otherwise;
end;
run;
output()方法可以指定保存哈希内容的动态目标。考虑“将表分割成子集表,其名称基于变量值”“AKA”将一个数据集设置成根据组变量命名的多个数据集。有些方法需要对数据进行预解析(如在发布的代码中),而其他方法则不需要
这里有一些基于散列的拆分器代码
您可以在sas社区上找到其他数据拆分器。如果要使用
%scan()
,只需创建一个宏变量即可
select distinct set
into :z separated by ' '
from &set
;
%let hm=&sqlobs;
DATA
语句将在第一个分号处结束。但是您正在生成&hm+1
分号,而不是一个。从%do
循环中删除假分号
data
%do i =1 %to &hm;
%scan(&z, &i)
%end;
;
这是怎么回事,让你觉得不走运?它只创建了一个名为“z”的数据集,而不是我想使用“set”列中的值创建的三个数据集,Google'sas将数据拆分为子集',如果这是你正在尝试做的,你会发现大量的示例。感谢回复!1:是的,这是有意的,我称第一个参数为“set”,但这也是存储集合名称的列的名称,我的意思是。3:谢谢你的澄清,我只是从每件事开始,所以我还是可能会误解一些事情。如果它们是变量,那么使用symget()或其他方式访问它们就足够了吗?