我想将每个变量的计数与另一个表中的变量存储在一起。我想在变量列表上使用循环。首先,我将变量名称存储在" vars"中,执行此操作:
proc sql ;
select name
into :vars separated by ' '
from dictionary.columns
where libname eq 'HW' and
memname eq "ORDERS";
quit;
然后,我使用以下代码创建了另一个列表,其中包含count的结果:
%macro g();
%let b=;
%do i = 1 %to 3;
%let a=%scan(&vars,&i);
proc sql;
select count(distinct &a)
into :gaby from hw.ORDERS;
quit;
%let b=&b &gaby;
%end;
%put &b;
%mend g;
%g();
在此之后,我想将两者都添加到表中,但我可以添加vars变量而不是b变量。
data a;
call symput('lista', symget('vars'));
call symput('lista1', symget('b'));
do i=1 to 3;
timept=i;
variable=scan("&vars",i);
dist=scan("&b",i);
output;
end;
run;
该表正确显示了变量的名称,但不是显示不同的计数(存储在b中)而是显示字母" b"。
有没有办法执行此操作?还有,有办法轻松实现吗?
感谢!!!!!!!!!!
答案 0 :(得分:1)
你非常接近。我只使用一个SQL传递并直接创建输出表。如果您希望以列形式使用,请使用PROC TRANSPOSE
。
proc sql noprint;
select name
into :vars separated by ' '
from dictionary.columns
where libname eq 'SASHELP' and
memname eq "SHOES";
quit;
%put &vars;
%macro create_table();
proc sql noprint;
%local i n var;
%let n = %sysfunc(countw(&vars));
create table output as
select
%do i=1 %to %eval(&n-1);
%let var = %scan(&vars,&i);
count(distinct &var) as &var,
%end;
%let var = %scan(&vars,&n);
count(distinct &var) as &var
from sashelp.shoes;
quit;
%mend;
%create_table;
proc transpose data=output out=want(rename=(_NAME_=variable COL1=Dist));
run;