在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;