Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS-为所有变量创建虚拟变量_Sas_Dummy Variable - Fatal编程技术网

SAS-为所有变量创建虚拟变量

SAS-为所有变量创建虚拟变量,sas,dummy-variable,Sas,Dummy Variable,对于给定的记录,我有一个包含X个分类变量的数据集。我希望以某种方式将此数据集转换为具有虚拟变量的新数据集,但我希望有一个命令/宏来获取数据集并为数据集中的所有变量生成虚拟变量 我也不想指定每个变量的名称,因为我可能有一个包含50个变量的数据集,所以必须指定每个变量的名称太麻烦了 假设我有一个这样的表,我想要结果表,上面的条件是我想要一个命令或单个宏,而不指定每个变量: 您可以使用PROC GLMSELECT生成您所要求的设计矩阵 data test; input id v1 $ v2 $

对于给定的记录,我有一个包含X个分类变量的数据集。我希望以某种方式将此数据集转换为具有虚拟变量的新数据集,但我希望有一个命令/宏来获取数据集并为数据集中的所有变量生成虚拟变量

我也不想指定每个变量的名称,因为我可能有一个包含50个变量的数据集,所以必须指定每个变量的名称太麻烦了

假设我有一个这样的表,我想要结果表,上面的条件是我想要一个命令或单个宏,而不指定每个变量:


您可以使用
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
。所以,如果你知道第一个和最后一个,你可以很容易地得到你想要的

您可以使用
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自己。请注意,如果可以的话,类变量通常是一种更好的方法,但并非所有的过程都支持

/*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;
这篇文章最初是从这里开始的,并且链接到了其他几种方法。
我更喜欢GLMMOD自己。请注意,如果可以的话,类变量通常是一种更好的方法,但并非所有的过程都支持

/*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;
这篇文章最初是从这里开始的,并且链接到了其他几种方法。
下面是一个使用简单的三观察数据集和@Reeza发布的PROC GLMMOD方法的修改版本的工作示例

首先,让我们用一个长字符ID变量创建一个示例数据集。我们将引入一个数字行变量,稍后可以使用该变量将设计矩阵与输入数据合并

data have;
   input id :$21. 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;
现在,让我们使用参数列表为临时文本文件生成rename语句

filename code temp;
data _null_;
  set parm end=eof;
  length rename $65 ;
  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;

下面是一个使用简单的三观察数据集和@Reeza发布的PROC GLMMOD方法的修改版本的工作示例

首先,让我们用一个长字符ID变量创建一个示例数据集。我们将引入一个数字行变量,稍后可以使用该变量将设计矩阵与输入数据合并

data have;
   input id :$21. 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;
现在,让我们使用参数列表为临时文本文件生成rename语句

filename code temp;
data _null_;
  set parm end=eof;
  length rename $65 ;
  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;

很好的回答,谢谢!一个简单的问题,我的id字段是一个字符,因为它是一个长21位的长数字。当我使用你的代码时,它不喜欢它是一个字符,但当我尝试转换为数字时,它会丢失信息并将id字段的结尾更改为任意值。我必须分配一个新的“id”字段,该字段正好等于要运行的行号。有更好的方法吗?当然,只需向数据集中添加一个带有行号的计数器变量并使用它。根据行号将ID加入到设计矩阵中。非常好的答案,谢谢!一个简单的问题,我的id字段是一个字符,因为它是一个长21位的长数字。当我使用你的代码时,它不喜欢它是一个字符,但当我尝试转换为数字时,它会丢失信息并将id字段的结尾更改为任意值。我必须分配一个新的“id”字段,该字段正好等于要运行的行号。有更好的方法吗?当然,只需向数据集中添加一个带有行号的计数器变量并使用它。根据行号将ID连接回设计矩阵。