【问题标题】:transpose with multiple variables in SAS在 SAS 中使用多个变量进行转置
【发布时间】:2013-04-01 16:15:30
【问题描述】:

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

【问题讨论】:

    标签: sas


    【解决方案1】:

    如果没有大量额外的工作,您将无法使用 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;
    

    【讨论】:

      【解决方案2】:

      您可以在单个数据步骤中执行此操作,并用宏包装,如下所示:

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

      【讨论】:

      • 既然可以使用数组,为什么还要使用宏?您只是引入了一个不必要的复杂步骤。
      • 乍看之下如果3不是这里的变量的实数,修改起来似乎比较容易,只是用来说明问题,而且代码少。
      • 在您没有任何需要或真正受益的地方插入一个宏只会给代码增加不必要的复杂性。您可以轻松添加宏参数 (%let numvars=3;),如果您可能需要修改该字段,甚至可以使用:通配符 (array labs lab:;)。一般来说,我认为为这类事情编写一个完整的数据步骤宏不是一个好主意,即使你不喜欢数组解决方案;只为内部部分编写一个宏,并在 datastep 中调用它。 IE, %trans(vars=%str(lab dt bili alb), num=3); .
      • 这种模式实际上经常出现在我的代码中,感谢您的提示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      相关资源
      最近更新 更多