通过两个变量转置表

时间:2017-11-09 10:49:19

标签: sas transpose

美好的一天,我有proc transpose的技术问题。例如,我的数据结构如下:

data begin; 
 input MAKName $ MLOName $ tcode $ Count Percent;
 cards;
 ABARTH  124     Miss  5     5.1 
 ABARTH  124     Hit   94    94.9 
 FIAT    124     Miss  30    12 
 FIAT    124     Hit   220   88 
;run;

我希望将其转换为使得这些行符合以下格式:

MAKName MLOName Count_miss percent_miss Count_hit Percent_hit 
ABARTH  124     5          5.0          94        94.9
FIAT    124     30         12           220       88 

所以我想将两条线压缩成一条线。变量或变量名的任何排列都是可以接受的。

我设法获得了转置命中,但第二个变量给了我一些问题。命名也是一个问题,但简单的重命名可以起作用。就我而言。

proc transpose data= Begin out= _test prefix=a_ ;
    by makname mloname; 
    var  count ; 
    idlabel tcode; 
run; quit;

任何有经验的数据操纵者都有时间帮忙解决这个问题吗?

编辑如下: 我的拼贴画想出了用2x转置做到这一点的方法:

proc transpose data=begin out=out1;
    by MakName MLOName tcode;
    var Count Percent;
run;

proc transpose data=out1 out=out2(drop=_NAME_) delimiter=_;
    by MakName MLOName;
    var Col1;
    id _NAME_ tcode;
run;

整洁的imho。

2 个答案:

答案 0 :(得分:1)

确实有办法用一个proc transpose做到这一点,但我没有看到它。

或者,您可以使用两个proc transpose和一个数据步骤merge轻松完成此操作:

data begin; 
 input MAKName $ MLOName $ tcode $ Count Percent;
 cards;
 ABARTH  124     Miss  5     5.1 
 ABARTH  124     Hit   94    94.9 
 FIAT    124     Miss  30    12 
 FIAT    124     Hit   220   88 
;
run;

proc transpose data=Begin out= count_test(drop=_name_) prefix=Count_;
  by makname mloname; 
  var  count; 
  id tcode; 
run;
proc transpose data=Begin out= percent_test(drop=_name_) prefix=Percent_;
  by makname mloname; 
  var  percent; 
  id tcode; 
run;
data want;
  merge count_test percent_test;
  by makname mloname;
run;

请注意,我将idlabel语句替换为id语句,以便根据需要为列创建名称。

编辑:同样的想法减少到一个proc transpose但仍然需要合并:

data begin; 
 input MAKName $ MLOName $ tcode $ Count Percent;
 cards;
 ABARTH  124     Miss  5     5.1 
 ABARTH  124     Hit   94    94.9 
 FIAT    124     Miss  30    12 
 FIAT    124     Hit   220   88 
;
run;

proc transpose data=Begin out=test;
  by makname mloname;
  var  count percent; 
  id tcode; 
run;

data want (drop=_name_);
merge test(where=(_name_='Count') rename=(Miss=Count_miss Hit=Count_hit))
      test(where=(_name_='Percent') rename=(Miss=Percent_miss Hit=Percent_hit));
by makname mloname;
run;

答案 1 :(得分:0)

我将这种形式的数据称为多轴。正如您所了解的那样,传统方法是转置+转置。其他技术包括:

  • 转置+合并(由user2877959显示)
  • 数组(用于静态数据配置)
  • 哈希(用于动态数据配置)
  • SQL codegen

无论采用何种技术,数据的重塑通常都表明了报告要求。考虑使用:

  • Proc TABULATE
  • Proc REPORT

这是一个制表示例:

ods listing;
options formchar="|----|+|---+=|-/\<>*";

data have; 
 input MAKName $ MLOName $ tcode $ Count Percent;
 cards;
 ABARTH  124     Miss  5     5.1 
 ABARTH  124     Hit   94    94.9 
 FIAT    124     Miss  30    12 
 FIAT    124     Hit   220   88 
;run;

proc tabulate data=have;
  class MAKName MLOName tcode;
  var Count Percent;
  table   
    MAKName * MLOName
    ,
    tcode='' * (Count*max=''*f=8. Percent*max='') / nocellmerge;

run;

ODS列表输出(HTML更好,但不能插入SO)

--------------------------------------------------------------------
|                      |         Hit         |        Miss         |
|                      |---------------------+---------------------|
|                      | Count  |  Percent   | Count  |  Percent   |
|----------------------+--------+------------+--------+------------|
|MAKName   |MLOName    |        |            |        |            |
|----------+-----------|        |            |        |            |
|ABARTH    |124        |      94|       94.90|       5|        5.10|
|----------+-----------+--------+------------+--------+------------|
|FIAT      |124        |     220|       88.00|      30|       12.00|
--------------------------------------------------------------------