sas如何使用列表来存储表中所有变量的不同

时间:2014-06-29 23:43:15

标签: list macros count sas distinct

我想将每个变量的计数与另一个表中的变量存储在一起。我想在变量列表上使用循环。首先,我将变量名称存储在" 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"。

有没有办法执行此操作?还有,有办法轻松实现吗?

感谢!!!!!!!!!!

1 个答案:

答案 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;