SAS中生成哑变量的一段宏代码

我们在建模时,可能经常会有一些将分类变量(categorical variable)转换成哑变量(dummy variable)的需求。例如“成绩”是一个分类变量,内容包含“优,良,中,差”四个分类,转换成哑变量之后,新生成了四个二元变量(binary variable),每个变量只有0和1两个值,通常0表示“否”,1表示“是”。貌似SAS中没有生成哑变量的过程步,因此自己写了一段宏实现了这个功能,代码如下:

data test;
input id $ class $;
datalines;
1 one
2 two
3 three
4 four
5 one
6 three
7 one
8 two
9 four
10 two
;
run;


*
ds_name--你要处理的数据集,这个数据集包含你要处理的变量。
target_var--你要处理的变量,可以是数值型也可以是文本型
;


options symbolgen mprint mlogic mcompile;  /*显示宏代码运行细节的代码,可加可不加*/
%macro categorical_to_binary(ds_name, target_var);
proc tabulate data=&ds_name. missing out=work.temp;  /*首先将变量的所有分类放入一个临时数据集*/
class &target_var.;
table &target_var.;
run;
data work.temp;  /*根据变量内容,建立新变量的变量名,即"target_var"+"_"+"变量内容" */
set work.temp;
&target_var._prefix = cats("&target_var.", '_', &target_var.);
keep &target_var. &target_var._prefix;
run;
%let dsid=%sysfunc(open(work.temp));
%let category_cnt=%sysfunc(attrn(&dsid.,nobs));
%let rc=%sysfunc(close(&dsid.));
proc sql;  /*将变量分类和新变量名放入2个宏变量*/
select &target_var., &target_var._prefix
into :var_list separated by ' ', :prefix_list separated by ' '
from work.temp;
quit;
data &ds_name.;  /*根据变量的分类数目生成if else语句*/
set &ds_name.;
var_list = symget('var_list');
%do i = 1 %to %eval(&category_cnt.); 
%scan(&prefix_list., &i.) = 0;
%end;
%do i = 1 %to %eval(&category_cnt. - 1);
if &target_var. eq scan(var_list, &i.) then %scan(&prefix_list., &i.) = 1;else
%end;
if &target_var. eq scan(var_list, &category_cnt.) then %scan(&prefix_list., &category_cnt.) = 1;
drop &target_var. var_list;
run;
proc datasets library=work noprint; delete temp(mt=data);quit;  /*删除临时数据集*/
%mend;
%categorical_to_binary(test, class)


转换前:

id class
1 one
2 two
3 three
4 four
5 one
6 three
7 one
8 two
9 four
10 two

转换后:

id class_four class_one class_three class_two
1 0 1 0 0
2 0 0 0 1
3 0 0 1 0
4 1 0 0 0
5 0 1 0 0
6 0 0 1 0
7 0 1 0 0
8 0 0 0 1
9 1 0 0 0
10 0 0 0 1

使用时需要注意的几点:

1.因为要利用目标变量分类内容构建新的变量名,所以待分类的变量内容不能有非法的SAS变量名字符。例如,原变量名是class,新的哑变量名是class_one,class_two,class_three,class_four。如果class的分类内容是“优,良,中,差”,那么在生成哑变量的时候会报错。

2.生成哑变量的时候会改变原始数据集,并且会drop掉目标变量。如果不想drop原来的目标变量,将drop语句中的&target_var.删除即可。

你可能感兴趣的:(SAS,SAS,dummy,variable,categorical,variable,转换,哑变量)