1
votes

Comment dénormaliser les données

J'ai une sortie proc signifie qui a des lignes pour chaque statistique récapitulative et des colonnes pour chaque variable. Comment puis-je "faire pivoter" ceci pour qu'il soit unique par la variable "by"?

Ma solution de contournement est de prendre la sortie et de la fusionner sur elle-même en utilisant les commandes WHERE et RENAME. Y a-t-il un moyen plus simple d'accomplir cela?

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

Cela devrait prendre un tableau au format suivant:

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

et afficher comme ceci:

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;

sas

0 commentaires

3 Réponses :


1
votes

Je pense que ces options vous donnent un ensemble de données plus utile avec des variables en lignes avec des niveaux CLASS.

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;

 entrez la description de l'image ici


0 commentaires

3
votes

Pourquoi ne pas utiliser AUTONAME et créer les données directement.

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

 entrez la description de l'image ici


3 commentaires

Merci! Exactement ce que je cherchais.


Je suis simplement curieux de savoir si cela ne provient pas d'un résumé de processus et que je voulais obtenir la table de données pour passer de la table de départ à la table de fin, y a-t-il un bon moyen de le faire avec une procédure SAS? Par exemple, si la colonne STAT était une autre colonne de classification et qu'elle était unique par MONTH et cette nouvelle colonne. La seule façon dont je peux penser est de faire ce qui est dans mon code d'origine. Merci pour l'aide!


@NathanPrzybylo Bien sûr, voyez ma nouvelle réponse.



2
votes

Transformez l'ensemble de données de sortie par défaut PROC MEANS / SUMMARY en style de nom automatique.

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;

entrez la description de l'image ici


1 commentaires

Merci j'apprécie l'aide!