如何规范化数据

时间:2019-05-09 18:18:19

标签: sas

我有一个proc means输出,其中每个摘要统计信息都有行,每个变量都有列。我该如何“透视”它,使其通过“ by”变量是唯一的?

我的解决方法是获取输出,并使用WHERE和RENAME命令将其合并到自身上。有更简单的方法可以做到这一点吗?

proc means data=data1 n mean max min std noprint;
  var var1 var2;
  by month;
  output out=SummaryStats;
run;
data SummaryStatsUnique;
  merge SummaryStats (in=in1 keep=month var1 var2 _stat_ rename=(var1=var1_N var2=var2_N) where=(_stat_="N"))
        SummaryStats (in=in2 keep=month var1 var2 _stat_ rename=(var1=var1_MEAN var2=var2_MEAN) where=(_stat_="MEAN"))
        SummaryStats (in=in3 keep=month var1 var2 _stat_ rename=(var1=var1_MAX var2=var2_MAX) where=(_stat_="MAX"))
        SummaryStats (in=in4 keep=month var1 var2 _stat_ rename=(var1=var1_MIN var2=var2_MIN) where=(_stat_="MIN"))
        SummaryStats (in=in5 keep=month var1 var2 _stat_ rename=(var1=var1_STD var2=var2_STD) where=(_stat_="STD"))
  ;
  by month;
  if ^(first.month and last.month) then abort;
  if ^(in1 and in2 and in3 and in4 and in5) then abort;
run;

这应该采用这样的表格格式:

MONTH     _STAT_     Var1     Var2
2019.01   N          19       15
2019.01   MEAN       17.5     13
2019.01   MAX        21       16
2019.01   MIN        15       12
2019.01   STD        2.5      1.5
2019.02   ...

并输出如下:

MONTH     VAR1_N     VAR2_N     VAR1_MEAN    VAR2_MEAN   ...
2019.01   19         15         17.5         13
2019.02   ...

3 个答案:

答案 0 :(得分:3)

为什么不使用AUTONAME并直接创建数据。

proc summary data=sashelp.class nway;
   class age;
   var height weight;
   output out=summary n= mean= max= min= std= / autoname;
   run;

enter image description here

答案 1 :(得分:1)

我认为这些选项为您提供了更有用的数据集,其中包含CLASS级行中的变量。

grid-auto-flow: column

enter image description here

答案 2 :(得分:1)

将PROC MEANS / SUMMARY默认输出数据转换为自动命名样式。

proc means noprint missing chartype data=sashelp.class;
   class sex;
   output out=stat1;
   run;
proc print;
   run;
proc transpose data=stat1(drop=_freq_) out=stat2;
   by _type_ sex _stat_ notsorted;
   run;
proc print;
   run;
proc transpose data=stat2 out=stat3 delim=_;
   by _type_ sex;
   id  _name_ _stat_;
   var col1;
   run; 
proc print;
   run;

enter image description here