目标是为该特定值设置指标变量,如果这是有意义的话。
以下是我的以下示例数据集:
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;
答案 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,否则使用数据步骤。