我们在建模时,可能经常会有一些将分类变量(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中生成哑变量的一段宏代码相关推荐

  1. 生成哑变量的几种方法

    1.logistic回归中可以生成哑变量 proc logistic data=yuyu; class  a_status / param=ref; run; 2.IF-THEN / ELSE 或者 ...

  2. 线性回归分析中的哑变量

    最近偶尔在重温统计学,发现自己工作后用了各种高级的统计分析方法,各种统计模型,却忽视了统计学中一些最基础的知识,而这些知识是所有这些高级方法的基础,基础不扎实,高级方法用起来真觉得底气不足,今天看到哑 ...

  3. 数据分析中的哑变量问题,该怎么处理?

    什么是虚拟变量? 虚拟变量又称哑变量,是人为设定的用于将分类变量引入模型中的方法. 为什么要使用虚拟变量 在回归分析中,自变量X既可以是定量数据也可以定类数据.回归分析计算时是将所有自变量X视为数字, ...

  4. 用spss做哑变量--给不敲代码同学福音

    今天给各位分享怎么用spss做哑变量,也算是给不想敲代码的同学带来一些福利. 首先介绍下什么是哑变量.哑变量是由虚拟变量衍生过来,指的是非数值型的字符变量转换而来的变量,通常情况下这些变量都是无序的变 ...

  5. SAS中创建分组变量

    分组变量创建的三种方式: *************分组变量的创建**********; DATA  obese1;     length  status  $ 15;     set  sashel ...

  6. VS中生成时“sgen.exe”已退出,代码为 1解决办法

    visual studio 2010 选定web项目,右键选择"属性"-"生成",将"生成序列化程序集"设成"关闭". ...

  7. 如何在SPSS中设置逻辑回归的哑变量

    哑变量,是一个人为设定的变量,通常取值为0到N,以职业分类来说,0代表学生,1代表工人,2代表老师等等,哑变量就是通过这种取值方式,以此来反映某个变量的不同属性. 哑变量的设置在各个回归模型中都非常重 ...

  8. python 分类变量转为哑变量_机器学习笔记——哑变量处理

    在机器学习的特征处理环节,免不了需要用到类别型特征,这类特征进入模型的方式与一般数值型变量有所不同. 通常根据模型的需要,类别型特征需要进行哑变量处理,即按照特征类别进行编码,一般一个类别为k的特征需 ...

  9. 哑变量的基本介绍及R语言设置

    哑变量的基本介绍及R语言设置 1. 哑变量的基本介绍[摘自医咖会] 1.1 什么是哑变量? 1.2 什么情况下需要设置哑变量? 1.3 如何设置哑变量的参照组? 1.4 设置哑变量时的注意事项 2. ...

最新文章

  1. windows10+Python3.7安装dlib库进行面部标志识别
  2. HDU 4292 Food(dinic +拆点)
  3. 微软29岁员工年薪税后85W!竟然说自己活得很惨!网友:确实挺惨!
  4. 【jQuery 区别】attr()和prop()的区别
  5. visual studio写python_微软发布Visual Studio的Python开发插件
  6. 【Python教程】30个语言特性技巧整理
  7. 解决类似/usr/lib64/libstdc++.so.6:version `GLIBCXX_3.4.21` not found的问题
  8. 经典面试题:聊一聊垃圾回收算法
  9. git 创建webpack项目_从0到1开发一个小程序cli脚手架(一)创建页面/组件模版篇...
  10. 我的JavaWeb学习1
  11. Hibernate中的sql的所有的查询
  12. 使IE6支持PNG透明图片的JS插件
  13. 上传文件时服务器返回错误信息,上传文件时的错误提示
  14. C语言编程练习,猜数字游戏实现
  15. 计算机网络笔记四 无线局域网
  16. 免费url长网址缩短压缩工具评测,短链接在线生成器推荐。
  17. 2022.4.21 python中关于sklearn 0.18的错误—— cannot import name comb
  18. SRE运维工程师笔记-文件查找和压缩
  19. 5-4 九宫格输入法 (15分)
  20. win10背景色改成豆沙绿 锁屏后失效修改方式

热门文章

  1. 如何用WinRAR解压缩7z分卷文件
  2. 信息检索——查全率和查准率
  3. OLED屏显+汉字点阵
  4. 五大原因!为何要将Jupyter Notebook转换为python脚本?
  5. 推荐一本小说《官场风流》
  6. 软件开发项目中进行实际日程安排
  7. 美国发布20项重大科技趋势,将在未来30年改变世界!
  8. 不懂时间管理的本质,你就只能越来越忙……
  9. 浅谈常用的几种显微镜相比的区别
  10. Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2)问题解决