Tengo un proceso de salida de medios que tiene filas para cada resumen de estadísticas y columnas para cada variable. ¿Cómo puedo "pivotar" esto para que sea único por la variable "por"?

Mi solución es tomar la salida y fusionarla en sí misma usando los comandos WHERE y RENAME. ¿Hay una manera más fácil de lograr esto?

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;

Esto debería tomar una tabla con el siguiente formato:

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

Y salida como esta:

MONTH     VAR1_N     VAR2_N     VAR1_MEAN    VAR2_MEAN   ...
2019.01   19         15         17.5         13
2019.02   ...
sas
1
Nathan Przybylo 9 may. 2019 a las 21:18

3 respuestas

La mejor respuesta

Transforme el conjunto de datos de salida por defecto PROC MEANS / SUMMARY en estilo de nombre automático.

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

2
data _null_ 10 may. 2019 a las 19:13

¿Por qué no usar AUTONAME y crear los datos directamente?

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

3
data _null_ 9 may. 2019 a las 18:59

Creo que estas opciones le brindan un conjunto de datos más útil con variables en filas con niveles de CLASE.

ods select none;
proc means data=sashelp.class n mean max min std stackods;
   class age;
   var height weight;
   ods output summary=summary;
   run;
ods select all;
proc print;
   run;

enter image description here

1
data _null_ 9 may. 2019 a las 18:31