SAS - 为所有变量创建虚拟变量
SAS - Create Dummy Variables for All Variables
我有一个数据集,其中给定记录有 X 个分类变量。我想以某种方式将这个数据集变成一个带有虚拟变量的新数据集,但我想要一个命令/宏来获取数据集并为数据集中的所有变量创建虚拟变量。
我也不想指定每个变量的名称,因为我可能有一个包含 50 个变量的数据集,所以必须指定每个变量名称太麻烦了。
假设我有一个像这样的 table,我想要结果 table,在上述条件下我想要一个命令或单个宏而不指定每个单独的变量:
您可以使用PROC GLMSELECT
生成设计矩阵,这就是您所要求的。
data test;
input id v1 $ v2 $ v3 $ ;
datalines;
1 A A A
2 B B B
3 C C C
4 A B C
5 B A A
6 C B A
;
proc glmselect data=test outdesign(fullmodel)=test_design noprint ;
class v1 -- v3;
model id = v1 -- v3 /selection=none noint;
run;
您可以使用--
指定第一个和最后一个之间的所有变量。请注意,我不必键入 v2
。所以如果你知道第一个和最后一个,你可以很容易地得到你想要的。
我自己更喜欢GLMMOD。请注意,如果可以的话,CLASS 变量通常是一种更好的方法,但并非所有 PROCS 都支持。
/*Run model within PROC GLMMOD for it to create design matrix
Include all variables that might be in the model*/
proc glmmod data=sashelp.class outdesign=want outparm=p;
class sex age;
model weight=sex age height;
run;
/*Create rename statement automatically
THIS WILL NOT WORK IF YOUR VARIABLE NAMES WILL END UP OVER 32 CHARS*/
data p;
set p;
if _n_=1 and effname='Intercept' then
var='Col1=Intercept';
else
var=catt("Col", _colnum_, "=", catx("_", effname, vvaluex(effname)));
run;
proc sql ;
select var into :rename_list separated by " " from p;
quit;
/*Rename variables*/
proc datasets library=work nodetails nolist;
modify want;
rename &rename_list;
run;
quit;
proc print data=want;
run;
最初来自这里,post 有指向其他几种方法的链接。
https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-dummy-variables-Categorical-Variables/ta-p/308484
这是一个使用简单的三观察数据集和@Reeza 发布的 PROC GLMMOD 方法的修改版本的工作示例
首先让我们制作一个带有长字符 ID 变量的示例数据集。我们将引入一个数字 ROW 变量,稍后我们可以使用它来将设计矩阵与输入数据合并。
data have;
input id :. education_lvl $ income_lvl $ ;
row+1;
datalines;
1 A A
2 B B
3 C C
;
您可以将变量列表设置为宏变量,因为我们需要在多个地方使用它。
%let varlist=education_lvl income_lvl;
使用 PROC GLMMOD 生成设计矩阵和参数列表,稍后我们将使用它们来生成用户友好的变量名称。
proc glmmod data=have outdesign=design outparm=parm noprint;
class &varlist;
model row=&varlist / noint ;
run;
现在让我们使用参数列表生成重命名语句到临时文本文件。
filename code temp;
data _null_;
set parm end=eof;
length rename ;
rename = catx('=',cats('col',_colnum_),catx('_',effname,of &varlist));
file code ;
if _n_=1 then put 'rename ' ;
put @3 rename ;
if eof then put ';' ;
run;
现在让我们合并回输入数据并重命名设计矩阵中的变量。
data want;
merge have design;
by row ;
%inc code / source2;
run;
我有一个数据集,其中给定记录有 X 个分类变量。我想以某种方式将这个数据集变成一个带有虚拟变量的新数据集,但我想要一个命令/宏来获取数据集并为数据集中的所有变量创建虚拟变量。
我也不想指定每个变量的名称,因为我可能有一个包含 50 个变量的数据集,所以必须指定每个变量名称太麻烦了。
假设我有一个像这样的 table,我想要结果 table,在上述条件下我想要一个命令或单个宏而不指定每个单独的变量:
您可以使用PROC GLMSELECT
生成设计矩阵,这就是您所要求的。
data test;
input id v1 $ v2 $ v3 $ ;
datalines;
1 A A A
2 B B B
3 C C C
4 A B C
5 B A A
6 C B A
;
proc glmselect data=test outdesign(fullmodel)=test_design noprint ;
class v1 -- v3;
model id = v1 -- v3 /selection=none noint;
run;
您可以使用--
指定第一个和最后一个之间的所有变量。请注意,我不必键入 v2
。所以如果你知道第一个和最后一个,你可以很容易地得到你想要的。
我自己更喜欢GLMMOD。请注意,如果可以的话,CLASS 变量通常是一种更好的方法,但并非所有 PROCS 都支持。
/*Run model within PROC GLMMOD for it to create design matrix
Include all variables that might be in the model*/
proc glmmod data=sashelp.class outdesign=want outparm=p;
class sex age;
model weight=sex age height;
run;
/*Create rename statement automatically
THIS WILL NOT WORK IF YOUR VARIABLE NAMES WILL END UP OVER 32 CHARS*/
data p;
set p;
if _n_=1 and effname='Intercept' then
var='Col1=Intercept';
else
var=catt("Col", _colnum_, "=", catx("_", effname, vvaluex(effname)));
run;
proc sql ;
select var into :rename_list separated by " " from p;
quit;
/*Rename variables*/
proc datasets library=work nodetails nolist;
modify want;
rename &rename_list;
run;
quit;
proc print data=want;
run;
最初来自这里,post 有指向其他几种方法的链接。 https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-dummy-variables-Categorical-Variables/ta-p/308484
这是一个使用简单的三观察数据集和@Reeza 发布的 PROC GLMMOD 方法的修改版本的工作示例
首先让我们制作一个带有长字符 ID 变量的示例数据集。我们将引入一个数字 ROW 变量,稍后我们可以使用它来将设计矩阵与输入数据合并。
data have;
input id :. education_lvl $ income_lvl $ ;
row+1;
datalines;
1 A A
2 B B
3 C C
;
您可以将变量列表设置为宏变量,因为我们需要在多个地方使用它。
%let varlist=education_lvl income_lvl;
使用 PROC GLMMOD 生成设计矩阵和参数列表,稍后我们将使用它们来生成用户友好的变量名称。
proc glmmod data=have outdesign=design outparm=parm noprint;
class &varlist;
model row=&varlist / noint ;
run;
现在让我们使用参数列表生成重命名语句到临时文本文件。
filename code temp;
data _null_;
set parm end=eof;
length rename ;
rename = catx('=',cats('col',_colnum_),catx('_',effname,of &varlist));
file code ;
if _n_=1 then put 'rename ' ;
put @3 rename ;
if eof then put ';' ;
run;
现在让我们合并回输入数据并重命名设计矩阵中的变量。
data want;
merge have design;
by row ;
%inc code / source2;
run;