在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 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更独立。在单个数据或proc步骤中是否没有语法来执行此操作?
答案 0 :(得分:8)
如果没有大量的额外工作,你不会用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;
答案 1 :(得分:0)
您可以在一个数据步骤中执行此操作,包含在宏中,如下所示:
%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;