在SAS中,每个值都需要一个虚拟变量,该值在新变量的后缀中

在SAS中,每个值都需要一个虚拟变量,该值在新变量的后缀中,sas,Sas,如果有意义的话,目标是为该特定值设置一个指标变量 以下是我的示例数据集: data test; input Patient $ ID V1 V2 V3; datalines; A 133521 88 254 170 B 673451 254 99 190 ; run; 基本上我需要的是,对于每个患者和ID,我需要一个虚拟变量来表示V1-V3的每个值。例如,在新的数据集中有一个名为V_254的变量,每个患者和ID都有一个1。还有一个变量叫做

如果有意义的话,目标是为该特定值设置一个指标变量

以下是我的示例数据集:

data test;
    input Patient $ ID V1 V2 V3;
    datalines;
    A   133521  88  254 170
    B   673451  254 99  190
    ;
run;
基本上我需要的是,对于每个患者和ID,我需要一个虚拟变量来表示V1-V3的每个值。例如,在新的数据集中有一个名为V_254的变量,每个患者和ID都有一个1。还有一个变量叫做V_170,患者a为1,患者B为0。我认为这类似于设计矩阵

PROC TRANSREG做了一些与我想要的类似的事情,但是由于共线性(我想是吧?),它没有包括所有的值

下面的方法也很有效,但当两个患者的值相同(即254)时会出现相同的问题


我会分两步来做。首先,输出一个只有patient、id、variable和value的数据集。值始终为1;变量应为“v_254”

data vert;
  set have;
  array v_[3]; *this is v_1 v_2 v_3;
  do _t = 1 to dim(v_);
    variable = cats('V_',v_[_t]); *this will be like V_254;
    value=1;
    output;
  end;
  keep patient id variable value;
run;

proc transpose data=vert out=want;
  by patient id;
  id variable;
  var value;
run;
现在缺少1/了,如果想要得到0,只需通过数据步骤或过程扩展(查找“插值缺少的值”,并使用0作为SETMISS转换的值(
transformout=SETMISS 0
):


这需要ETS获得许可,否则请使用data step。

谢谢您的建议,Joe。
proc transpose data = test out = long (rename=(Col1=V_));
    by patient id;
    var v1 v2 v3;
run;

proc transreg data=long design;
   model class(V_/ zero=last);
   id Patient ID;
   output out=long1(drop=_: Int:);
run;
data vert;
  set have;
  array v_[3]; *this is v_1 v_2 v_3;
  do _t = 1 to dim(v_);
    variable = cats('V_',v_[_t]); *this will be like V_254;
    value=1;
    output;
  end;
  keep patient id variable value;
run;

proc transpose data=vert out=want;
  by patient id;
  id variable;
  var value;
run;
data test;  *dummy data for example;
  array v_[10];
  do id = 1 to 10;
    v_[id]=5;
    output;
  end;
  call missing(of v_:);
run;

proc expand data=test out=testout;
  id id;
  convert v_:/transformout=(setmiss 0);
run;