data test;
input a b c d e $ f $;
cards;
1 2 3 4 a b
2 . 4 0 c d
11 23 4 5 f g
0.12 0.11 0.23 . m n
8.6 6.7 8.9 9.8 j k
3,4 -1.2 -1.6 -4.5 e hj
;
run;
%macro zhentai(a);
data end;
set &a(drop=_numeric_);
run;
data a;
set &a end=last;
keep _numeric_;if last then call symput('count',_n_);
run;
%put &count;
proc means data=a mean std ;
output out=b(drop=_type_ _freq_);
run;
proc transpose data=b out=b(keep=MEAN STD);
var _numeric_;
id _stat_;
run;
proc transpose data=a out=c;
var _all_;
run;
data c;
merge c b;
run;
%macro t;
data c;
set c;
%do i=1 %to &count;
COL&i=(COL&i-MEAN)/STD;
%end;
run;
%mend t;
%t;
proc transpose data=c(drop=MEAN STD) out=c(drop=_name_);
var _numeric_;
id _name_;
run;
data c;
merge c end;
run;
proc print; run;
%mend zhentai;
%zhentai(test);
写了一个宏,可以将一个数据集合正态化,如果里面有字符变量也没有关系,最后的数据集合vwork.c就是正态化的集合。
做的时候先编译宏,就是运行一下,然后写%zhentai(test);将test换成要转化的数据集合就可了,运行后自动打印出一个集合c,就是正太后的集合了。(但是要注意不能有时间类型的变量,如果有时间类型的变量先删除,提取再合并就可以了,因为sas中时间变量也是数值的)我记得确实有一个语句可以正态化数据,但是我忘记了。好像是主成分里面的,但是没有查到,只能先写一个宏了,希望对你有用。