在SAS中,如何对表进行转置,为列中的每个唯一值生成虚拟变量

在SAS中,如何对表进行转置,为列中的每个唯一值生成虚拟变量,sas,Sas,使用SAS,我试图转换表中的数据,以便变量类和子类的每个唯一值通过变量ID成为虚拟变量 拥有: 想要: 我已尝试在转置过程的ID语句中,通过变量ID和Class和Subclass转置数据。但是,这会产生由类和子类的值的唯一组合串联而成的变量。在转置过程中未定义VAR的情况下,该方法也不会产生0和1值 我需要先创建实际的虚拟变量,然后再转换数据以获得想要的表,还是有更直接的方法 这里是一些复杂的代码生成,它使用散列将值映射到数组索引,该数组索引对应于表示的存在状态的标志变量 下面是一些棘手的代码生

使用SAS,我试图转换表中的数据,以便变量
子类
的每个唯一值通过变量
ID
成为虚拟变量

拥有:

想要:

我已尝试在转置过程的ID语句中,通过变量
ID
Class
Subclass
转置数据。但是,这会产生由
子类
的值的唯一组合串联而成的变量。在转置过程中未定义VAR的情况下,该方法也不会产生0和1值


我需要先创建实际的虚拟变量,然后再转换数据以获得想要的表,还是有更直接的方法

这里是一些复杂的代码生成,它使用散列将值映射到数组索引,该数组索引对应于表示
的存在状态的标志变量


下面是一些棘手的代码生成,它使用散列将值映射到对应于表示
\uuuu
存在状态的标志变量的数组索引


您还可以对每个变量执行distinct和使用TRANSPOSE,并将其合并回来

  data have;
 input ID  $      Class  $      Subclass   $  ;
 datalines;      
 ID1        1           1a          
 ID1        1           1b           
 ID1        1           1c           
 ID1        2           2a
 ID2        1           1a           
 ID2        1           1b           
 ID2        2           2a           
 ID2        2           2b              
 ID2        3           3a
 ID3        1           1a                      
 ID3        1           1d 
 ID3        2           2a
 ID3        3           3a           
 ID3        3           3b  
 ;

  proc sql;
  create table want1 as 
  select distinct id, class from have;

 proc transpose data = want1 out=want1a(drop =_name_) prefix = class_;
  by id;
  id class;
  var class;
   run;

   proc sql;
   create table want2 as 
   select distinct id, subclass from have;

   proc transpose data = want2 out=want2a(drop =_name_) prefix = Subclass_;
   by id;
   id subclass;
    var Subclass;
     run;

 data want;
merge want1a want2a;
by id;
 array class(*) class_: subclass_:;
do i = 1 to dim(class);
 if missing(class(i)) then class(i)= "0";
 else class(i) ="1"; 
end; 
drop i;
run;

您还可以对每个变量执行distinct和使用TRANSPOSE,并将其合并回来

  data have;
 input ID  $      Class  $      Subclass   $  ;
 datalines;      
 ID1        1           1a          
 ID1        1           1b           
 ID1        1           1c           
 ID1        2           2a
 ID2        1           1a           
 ID2        1           1b           
 ID2        2           2a           
 ID2        2           2b              
 ID2        3           3a
 ID3        1           1a                      
 ID3        1           1d 
 ID3        2           2a
 ID3        3           3a           
 ID3        3           3b  
 ;

  proc sql;
  create table want1 as 
  select distinct id, class from have;

 proc transpose data = want1 out=want1a(drop =_name_) prefix = class_;
  by id;
  id class;
  var class;
   run;

   proc sql;
   create table want2 as 
   select distinct id, subclass from have;

   proc transpose data = want2 out=want2a(drop =_name_) prefix = Subclass_;
   by id;
   id subclass;
    var Subclass;
     run;

 data want;
merge want1a want2a;
by id;
 array class(*) class_: subclass_:;
do i = 1 to dim(class);
 if missing(class(i)) then class(i)= "0";
 else class(i) ="1"; 
end; 
drop i;
run;

似乎您需要PROC TRANSREG的帮助来生成一个简化的设计矩阵

data id;
   infile datalines firstobs=3;
   input ID :$3. class subclass :$2.;
   datalines;
ID        Class        Subclass
-------------------------------
ID1        1           1a
ID1        1           1b
ID1        1           1c
ID1        2           2a
ID2        1           1a
ID2        1           1b
ID2        2           2a
ID2        2           2b
ID2        3           3a
ID3        1           1a
ID3        1           1d
ID3        2           2a
ID3        3           3a
ID3        3           3b
;;;;
   run;
proc print;
   run;
proc transreg;
   id id;
   model class(class subclass / zero=none);
   output design out=dummy(drop=class subclass);
   run;
proc print;
   run;
proc summary nway;
   class id;
   output out=want(drop=_type_) max(class: subclass:)=;
   run;
proc print;
   run;

似乎您需要PROC TRANSREG的帮助来生成一个简化的设计矩阵

data id;
   infile datalines firstobs=3;
   input ID :$3. class subclass :$2.;
   datalines;
ID        Class        Subclass
-------------------------------
ID1        1           1a
ID1        1           1b
ID1        1           1c
ID1        2           2a
ID2        1           1a
ID2        1           1b
ID2        2           2a
ID2        2           2b
ID2        3           3a
ID3        1           1a
ID3        1           1d
ID3        2           2a
ID3        3           3a
ID3        3           3b
;;;;
   run;
proc print;
   run;
proc transreg;
   id id;
   model class(class subclass / zero=none);
   output design out=dummy(drop=class subclass);
   run;
proc print;
   run;
proc summary nway;
   class id;
   output out=want(drop=_type_) max(class: subclass:)=;
   run;
proc print;
   run;

添加一个。我想你需要两个转置,每个变量一个。不过有一个更快的方法,看看GLMMOD。看看这里的帖子:添加一个。我想你需要两个转置,每个变量一个。不过有一个更快的方法,看看GLMMOD。请看这里的帖子:
  data have;
 input ID  $      Class  $      Subclass   $  ;
 datalines;      
 ID1        1           1a          
 ID1        1           1b           
 ID1        1           1c           
 ID1        2           2a
 ID2        1           1a           
 ID2        1           1b           
 ID2        2           2a           
 ID2        2           2b              
 ID2        3           3a
 ID3        1           1a                      
 ID3        1           1d 
 ID3        2           2a
 ID3        3           3a           
 ID3        3           3b  
 ;

  proc sql;
  create table want1 as 
  select distinct id, class from have;

 proc transpose data = want1 out=want1a(drop =_name_) prefix = class_;
  by id;
  id class;
  var class;
   run;

   proc sql;
   create table want2 as 
   select distinct id, subclass from have;

   proc transpose data = want2 out=want2a(drop =_name_) prefix = Subclass_;
   by id;
   id subclass;
    var Subclass;
     run;

 data want;
merge want1a want2a;
by id;
 array class(*) class_: subclass_:;
do i = 1 to dim(class);
 if missing(class(i)) then class(i)= "0";
 else class(i) ="1"; 
end; 
drop i;
run;
data id;
   infile datalines firstobs=3;
   input ID :$3. class subclass :$2.;
   datalines;
ID        Class        Subclass
-------------------------------
ID1        1           1a
ID1        1           1b
ID1        1           1c
ID1        2           2a
ID2        1           1a
ID2        1           1b
ID2        2           2a
ID2        2           2b
ID2        3           3a
ID3        1           1a
ID3        1           1d
ID3        2           2a
ID3        3           3a
ID3        3           3b
;;;;
   run;
proc print;
   run;
proc transreg;
   id id;
   model class(class subclass / zero=none);
   output design out=dummy(drop=class subclass);
   run;
proc print;
   run;
proc summary nway;
   class id;
   output out=want(drop=_type_) max(class: subclass:)=;
   run;
proc print;
   run;