我们在建模时,可能经常会有一些将分类变量(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个宏变量*/