proc means data=a nway noprint;
var a--m;
class name;
output out=aa(drop=_type_ _freq_) range=r1-r50;
run;
data result(drop=r1-r50 i) ;
set aa;
array r{50} r1-r50;
array v{50} $;
do i=1 to dim(r);
if r(i) then v(i)='N';
else v(i)='Y';
end;
run;
如果你想把v1-v50还是用原来项目的变量名,请参考以下程序(还是以50个变量为例子):
[code:334jje0v]
data _null_;
length val $800;
dsid=open('a');
array tt{50} $20;
do i=1 to 50;
tt(i)=varname(dsid,i+1);
end;
val=catx('',of tt1-tt4);
call symput('val',trim(left(val)));
rs=close(dsid);
run;
proc means data=a nway noprint;
var &val;
class name;
output out=aa(drop=_type_ _freq_) range=r1-r50;
run;
data result(drop=r1-r50 i) ;
set aa;
array r{*} r1-r50;
array v{*} $ &val;
do i=1 to dim(r);
if r(i) then v(i)='N';
else v(i)='Y';
end;
run;
[code:3695cfor]data aa;
input name $ a b c d ;
cards;
XX 1 2 3 4
XX 1 2 3 4
XX 2 2 3 4
YY 1 1 1 1
YY 1 1 1 2
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
;
proc sort;by name;run;
proc sql noprint;
select count(name) into :n from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
select name into :name separated by ' ' from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
quit;
data bb(drop=&name i x);
set aa;by name;
array aa _numeric_;
array bb(&n);
do i=1 to dim(aa);
x=lag(aa(i));
if aa(i)-x=0 then aa(i)=.;
if first.name then aa(i)=.;
bb(i)=aa(i);
end;
run;
run;
data cc(keep=name &name);
set bb;by name;
array aa _numeric_;
array bb(&n) $ &name;
retain &name;
do i=1 to &n;
if aa(i) ne . then bb(i)='N';
if first.name then bb(i)=' ';
end;
if last.name;
run;
[/code:3695cfor]
在byes的程序基础上用点macro,means在这儿确实可以减少步骤
[code:2d9g9f37]data aa;
input name $ a b c d ;
cards;
XX 1 2 3 4
XX 1 2 3 4
XX 2 2 3 4
YY 1 1 1 1
YY 1 1 1 2
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
;
run;
proc sql noprint;
select put(count(name),5.-L) into :n from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
select name into :name separated by ' ' from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
quit;
proc means data=aa nway noprint;
var &name;
class name;
output out=bb(drop=_type_ _freq_) range=r1-r&n.;
run;
data result(drop=r1-r&n. i) ;
set bb;
array r{&n} r1-r&n.;
array v{&n} $ &name;
do i=1 to dim(r);
if r(i) then v(i)='N';
end;
run;
[/code:2d9g9f37]
proc sql;
select compbl(', case when max('||name||')<>min('||name||') then "N" else "" end as '|| name) into :statement separated by ''
from sashelp.vcolumn
where memname='AHUIGE' and libname='WORK' and name<>'name'
;
proc sql;
create table final as
select name &statement
from ahuige
group by name
;[/code:3b8kq62v]