3

在 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 步骤中执行此操作?

4

2 回答 2

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;
于 2013-04-01T16:47:32.677 回答
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;
于 2013-04-01T16:46:58.597 回答