在SAS中转换宽到长,无需额外的列

时间:2014-04-15 11:54:32

标签: sas

我想转置数据集,但SAS坚持要添加新列,如果是“by”列 有多个条目。

所以如果我跑

data test;
    input a b $ c $ ; 
datalines;
1  aaa bbb
1  bbb bbb
2  ccc ccc
3  ccc ccc
;
run;

proc transpose data=test;
   by a;
   var b b;
run;

我得到一个包含两列的表,如下所示:

1   b   aaa bbb
1   c   bbb bbb
2   b   ccc 
2   c   ccc 
3   b   ccc 
3   c   ccc 

我希望看到这样的表格:

1   b   aaa
1   c   bbb
1   b   bbb
1   c   bbb
2   b   ccc 
2   c   ccc 
3   b   ccc 
3   c   ccc   

因此,我希望SAS不添加列,而是为每个条目添加行。关于如何做到这一点的任何想法?

为了清楚起见,这是一个玩具的例子!我正在使用的数据集有更多列。

3 个答案:

答案 0 :(得分:4)

这应该有效(使用你的示例代码):

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;

答案 1 :(得分:2)

您不能在“混合”数据集(每组多个行和多个列)的一个步骤中使用PROC TRANSPOSE来获得更长的时间。转置只对所有这些都很有效。

最简单的获取方式通常是数据步骤。

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;

答案 2 :(得分:0)

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;