SAS中的多变量转置
在SAS中,我将列变量按顺序与相应的列变量并排堆叠,例如:SAS中的多变量转置,sas,Sas,在SAS中,我将列变量按顺序与相应的列变量并排堆叠,例如: id lab1 lab2 lab3 dt1 dt2 dt3 bili1 bili2 bili3 alb1 alb2 alb3 3 dx sx sx 2/04 2/06 3/08 x.x x.x x.x x.x x.x x.x 4 dx tx tx 5/05 3/06 9/06 x.x x.x x.x x.x x.x x.x 我想转换成以下长格式: id la
id lab1 lab2 lab3 dt1 dt2 dt3 bili1 bili2 bili3 alb1 alb2 alb3
3 dx sx sx 2/04 2/06 3/08 x.x x.x x.x x.x x.x x.x
4 dx tx tx 5/05 3/06 9/06 x.x x.x x.x x.x x.x x.x
我想转换成以下长格式:
id lab dt bili alb
3 dx 2/04 x.x x.x
3 sx 2/06 x.x x.x
3 sx 3/08 x.x x.x
4 dx 5/05 x.x x.x
4 tx 3/06 x.x x.x
4 tx 9/06 x.x x.x
但我似乎无法正确地操纵它
var lab1-lab3 dt1-dt3 bili1-bili3 alb1-alb3;
事实上,这和
var lab1-alb3
因此,每个列都是独立处理的,但我想对它们进行集群,以便SAS知道它们在长数据集中有单独的列。一些论坛建议我只执行转置几次,然后合并输出数据。这似乎不雅观,效率低下,难以阅读,乏味。。。比SAS本身更重要的是。没有语法可以在单个数据或过程步骤中执行此操作吗?您可以在单个数据步骤中执行此操作,包装在宏中,如下所示:
%macro trans;
data want(keep = id lab dt bili alb);
set have;
%do i = 1 %to 3;
lab = lab&i;
dt = dt&i;
bili = bili&i;
alb = alb&i;
output;
%end;
run;
%mend;
%trans; run;
如果没有大量的额外工作,使用PROC TRANSPOSE是不可能实现的。大多数情况下,从宽到长在数据步骤中更容易处理。在这种情况下,使用数组可以非常轻松地完成此操作
data have;
input id lab1 $ lab2 $ lab3 $ dt1 $ dt2 $ dt3 $
bili1 $ bili2 $ bili3 $ alb1 $ alb2 $ alb3 $;
datalines;
3 dx sx sx 2/04 2/06 3/08 x.x x.x x.x x.x x.x x.x
4 dx tx tx 5/05 3/06 9/06 x.x x.x x.x x.x x.x x.x
;;;;
run;
data want;
set have;
array labs lab1-lab3;
array dts dt1-dt3;
array bilis bili1-bili3;
array albs alb1-alb3;
do _t = 1 to dim(labs);
lab = labs[_t];
dt = dts[_t];
bili= bilis[_t];
alb = albs[_t];
output;
end;
keep id lab dt bili alb;
run;
既然可以使用数组,为什么还要使用宏?你只是引入了一个不必要的额外的复杂步骤。乍一看,如果3不是这里变量的实际数量,那么修改似乎更容易,但只用于说明问题,代码更少。在没有任何需要或实际好处的地方插入宏,只会给代码增加不必要的复杂度。您可以轻松添加宏参数(
%let numvars=3;
),或者如果您可能需要修改该字段,甚至只需使用:通配符(数组实验室:;
)。一般来说,我认为为这类事情编写一个完整的数据步宏不是一个好主意,即使您不喜欢数组解决方案;只为内部部分编写一个宏,并在datastep中调用它。即%trans(vars=%str(lab dt bili alb),num=3)。这个模式在我的代码中经常出现,谢谢你的提示。