Wert der by-Variablen abfangen

Liebe Redscope Community,

ich hätte eine Frage zum By-Statement, bspw. bei der Proc GPLOT:

Gibt es einen Weg, den jeweils aktuellen Inhalt von by abzufragen, um bspw. die dabei generierte Grafik dementsprechend zu benennen?

Sortierung einer Datei abfragen

Man kann abfragen, wie eine Datei sortiert wurde, da PROC SORT die Sortierfolge im Beschreibungsteil jeder sortierten Datei ablegt. Dafür gibt es zwei Verfahren, wobei das erste kürzer, das zweite flexibler ist.

Das erste Verfahren wendet zwei SAS-Funktionen an, nämlich open und attrc. Open öffnet die Datei und gibt einen Dataset-Identifiert zurück, den man dann an attrc übergeben kann, das den Wert einer bestimmten Dateieigenschaft, in diesem Fall die Sortierreihenfolge, zurückgibt.

proc sort data=sashelp.class out=work.class;
   
by Sex age descending height;
run;

/* Lösung 1 über SAS-Functionen */
%let dsid=%sysfunc(open(work.class));
%let sortedby1=%sysfunc(attrc(&dsid,SORTEDBY));
%let dsid=%sysfunc(close(&dsid));
%put Datei work.class ist sortiert nach &sortedby1;

Das zweite Verfahren verwendet PROC CONTENTS, um den kompletten Beschreibungsteil der SAS-Datei in eine weitere SAS-Datei auszugeben. Dort steht dann auch die Sortierfolge drin, nämlich in Form einer Nummerierung in der Spalte SORTEDBY. Absteigende Sortierreihenfolge wird dabei durch negative Zahlen ausgedrückt. Ich habe ein kleines Beispiel angefügt, wie man die Sortierreihenfolge in Makrovariablen auslesen und anschließend verwenden kann.

/* Lösung 2 über PROC CONTENTS */
proc contents noprint data=work.class out=contents;
run;

proc sql noprint;
   
select
      
name                 /* Variablenname */
     
,sign(sortedby)       /* +1 aufsteigend, -1 absteigend */
     
,count(*)             /* Anzahl Sortiervariablen */
     
,abs(sortedby) as abs /* für die richtige Reihenfolge */
   
into
      
:sorted1-:sorted5    /* es werden nur so viele */
     
,:sign1-:sign5        /*   Makrovariablen erzeugt, */
     
,:sortcount           /*   wie nötig (hier maximal 5) */
     
,:dummy
   
from contents
   
where sortedby is not missing
   
order by abs;
quit;

%macro gplot;
title
'Schülerdaten';
title2
"sortiert nach"
%local i;
%do i=1 %to &sortcount;
   
" &&sorted&i ("
   
%if &&sign&i=1 %then "absteigend";
   
%else "aufsteigend";
   
")"
   
%IF &i < &sortcount %then ",";
%end;
;
goptions ftext=
"Arial";
proc gplot data=class;
   plot weight * height;
run;
quit;
%mend gplot;
options mprint;
%gplot;

Vielen Dank für die

Vielen Dank für die Antwort. Hab wieder jede Menge dazugelernt.