通过两个变量转置 table

Transpose table by two variables

美好的一天,我遇到了 proc 转置的技术问题。例如我的数据结构如下:

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;

恕我直言。

确实有一种方法可以做到这一点 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;

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

编辑:相同的想法减少为一个 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;

我将这种数据塑造形式称为多轴心。如您所知,一种传统方法是转置 + 转置。其他技术包括:

  • 转置+合并(由user2877959展示)
  • 数组(用于静态数据配置)
  • 哈希(用于动态数据配置)
  • SQL代码生成

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

  • 过程制表
  • 过程报告

这里是一个制表例子:

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