在SAS中,我需要为每个值使用一个虚拟变量,其值为新变量的后缀

时间:2014-09-29 12:22:09

标签: 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.还会有一个名为V_170的变量,患者A为1,患者B为0.我会认为它类似于设计矩阵。

PROC TRANSREG做了类似于我想要的事情,但由于共线性而没有包含所有值(我认为?)。

proc transreg data=test design;
   model class(V1 - V3 / zero=last);
   id Patient ID;
   output out=TRANSREG(drop=_: Int:);
  run;

下面也很有效,除了当两个患者具有相同的值(即254)时出现同样的问题。

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;

1 个答案:

答案 0 :(得分:1)

我会分两步完成。首先,输出一个只有患者,id,变量和值的数据集。价值总是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,你只需要使用数据步骤或PROC EXPAND进行后处理(查找'插入缺失值'并使用零作为SETMISS转换的值(transformout=setmiss 0):

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;

这要求获得许可的ETS,否则使用数据步骤。