Transposing wide to long in SAS, without extra columns

后端 未结 3 1463
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-25 07:48

I\'d like to transpose a dataset, but SAS insists on adding a new column, if the \"by\" column has multiple entries.

So if I run

data test;
    input a b         


        
相关标签:
3条回答
  • 2021-01-25 08:12
    data output;
    set test;
    array vars {*} b -- c; * define array composed of list of variables from B to C, have to be of same type;
    
    length varname $32;
    keep a varname value;
    
    do i=1 to dim(vars);* loop array (list of variables);
        varname= vname(vars(i));* get name of variable that provided value;
        value = vars(i);* get the value of variable;
        output; *output row;
    end;
    run;
    
    0 讨论(0)
  • 2021-01-25 08:14

    You can't use PROC TRANSPOSE in a single step with a 'mixed' dataset (multiple rows per by group AND multiple columns) to get long. Transpose only really works well going all one or the other.

    Easiest way to get long is usually the data step.

    data want;
     set test;
     array vars b c;
     do _i = 1 to dim(vars);
      varname = vname(vars[_i]);
      value   = vars[_i];
      output;
     end;
     keep a varname value;
    run;
    
    0 讨论(0)
  • 2021-01-25 08:20

    This ought to work (using your example code):

    proc transpose data=test out=test_tran1(rename=(_name_ = old_var));
      by a;
      var b c;
    run;
    
    proc transpose data=test_tran1 out=test_tran2(drop=_: rename = (col1=values) where = (not missing(values)));
      by a old_var;
      var col:;
    run;
    
    0 讨论(0)
提交回复
热议问题