Domanda

Un'altra mia domanda SAS (ho notato che questi non vengono qui così spesso ...):

Ho un set di dati contenente qualcosa del genere:

Name  |  Category  |   Level  |  Score
John  |    cat1    |     1    |    80
John  |    cat1    |     2    |    70
John  |    cat1    |     3    |    10
John  |    cat2    |     1    |    60
John  |    cat2    |     2    |    95
John  |    cat2    |     3    |    43
John  |    cat2    |     4    |    28

E l'output (formato Excel) dovrebbe apparire:

      |    cat1      |    cat2       |
name  | 1  |  2  | 3 | 1 | 2 | 3 | 4 | 
John  | 80 | 70  |10 |60 |95 |43 |28 |

Quello che faccio ora è usare proc transpose Per ottenere i dati nel giusto ordine e poi proc exportPer andare a .xls.

Funziona bene, tranne una cosa. Non riesco a far funzionare il secondo livello di suddivisione. Quindi adesso, prima del mio proc transpose In realtà ho concatto la mia categoria e il mio livello nel mio set di dati (ad esempio che lo rendono '1_cat1') e poi trasponi su questo valore, dandomi il seguente output:

name  | 1_cat1 |  2_cat1 | 3_cat1 | 1_cat2 | 2_cat2 | 3_cat2 | 4_cat2 | 
John  |   80   |    70   |   10   |   60   |   95   |   43   |   28   |

C'è un modo per ottenere il primo output desiderato?

È stato utile?

Soluzione

Supponendo che tu abbia familiarità con il tuo ODS Opzioni per farlo in Excel (sto solo usando pigramente HTML e salvandolo come .xls, ma potresti usare tagset ecc. Invece), ecco un PROC REPORT Soluzione per visualizzare i dati nel formato che stai cercando. Scopri l'uso di across Variabili nel rapporto Proc. Probabilmente c'è un modo per sopprimere la colonna che non viene utilizzata sotto Cat1 nell'output, ma non riesco a ricordarlo adesso.

data testData;
  infile datalines dsd delimiter='|';
  input name $ category $ level score;
  datalines;
John  |    cat1    |     1    |    80
John  |    cat1    |     2    |    70
John  |    cat1    |     3    |    10
John  |    cat2    |     1    |    60
John  |    cat2    |     2    |    95
John  |    cat2    |     3    |    43
John  |    cat2    |     4    |    28
;
run;

ods html file="C:\SomePath\MyFile.xls";

proc report
  data=testData;
  columns name category,level,score;
  define name / group;
  define category / across '';
  define level / across '';
  define score / sum '';
run;

ods html close;

Altri suggerimenti

Non credo che sarai in grado di andare direttamente all'output desiderato usando Proc Transpose poiché stai cercando di ottenere ogni categoria per coprire più livelli. Potresti voler ricercare altre due procedure, report e tabulate. Credo che tu possa farlo direttamente da uno dei due, ma sono passati anni da quando li ho usati. Una terza opzione è quella di creare un file XML con ODS in cui puoi controllare praticamente esattamente come si desidera visualizzare, anche se ci vuole un po 'più di sforzo per imparare a farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top