【问题标题】:Transpose table by two variables通过两个变量转置表
【发布时间】:2017-11-09 10:49:18
【问题描述】:

您好,我有 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;

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

在下面编辑: 我的 collage 想出了用 2x transpose 做到这一点的方法:

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;

整洁的恕我直言。

【问题讨论】:

    标签: sas transpose


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

      • 转置 + 合并(由 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|
      --------------------------------------------------------------------
      

      【讨论】:

      • 确认工作。我喜欢。但是,我需要数据集中的数据以备将来使用。但请继续努力。
      猜你喜欢
      • 1970-01-01
      • 2021-03-02
      • 2016-08-23
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多