it-swarm.com.de

So lesen Sie Variablennamen in a SAS Datensatz?

Gibt es Anweisungen\Funktionen, mit denen der Name von Variablen ermittelt werden kann? Platzieren Sie sie vorzugsweise in einer Spalte eines anderen Datensatzes, eines Textfeldes oder einer Makrovariablen.

Z.B.

- Datensatz 1

Name age sex

    Jk   14   F
    FH   34   M
  • Erwarteter Datensatz

    Var_name_of_dataset1

    Name
    age
    sex
    

PS: Ich kenne eine Anweisung: select into, was sth relevant macht. Sie kann den Wert einer Spalte in ein Feld mit benutzerdefinierten Trennzeichen einlesen und wünscht sich daher, dass es ähnliche Möglichkeiten gibt, Spaltennamen in ein Feld oder eine Spalte einzulesen.

Vielen Dank

12
mj023119

PROC CONTENTS wäre der schnellste Weg, um diese Informationen in einem Datensatz zu erhalten. Spaltennamen finden Sie in der Spalte NAME.

proc contents data=sashelp.class out=contents noprint;
run;
25

Sie können auch Datastep- und Array-Funktionen verwenden, z.

 data colnames; 
 set sashelp.class (obs = 1); 
 
 Array n {*} _NUMERIC_; 
 Array c {*} _CHARACTER_; 
 
 Do i = 1 bis dim (n); 
 Vname = vname (n {i}); 
 Ausgabe; 
 Ende ; 
 do i = 1 bis dim (c); 
 vname = vname (c {i}); 
 Ausgabe; 
 Ende; 
 Lauf ;
19
Chris J
%macro getvars(dsn);
 %global vlist;
 proc sql;
 select name into :vlist separated by ' '
  from dictionary.columns
  where memname=upcase("&dsn");
 quit;
%mend;

Dadurch wird eine Makrovariable namens & vlist erstellt, die die Namen aller Variablen in Ihrer Datenmenge enthält, getrennt durch ein Leerzeichen. Wenn Sie Kommas zwischen den Variablennamen wünschen, müssen Sie lediglich den Wert für 'von' getrennt von '' in ',' ändern. Die Verwendung der upcase-Funktion in der where-Anweisung vermeidet Probleme, wenn jemand im falschen Fall den Namen der Datenmenge übergibt. Die globale Anweisung ist erforderlich, da die erstellte Makrovariable nicht notwendigerweise außerhalb des Makros verfügbar ist, ohne sie als global zu definieren

7
purnendumaity

Leicht geändert von SAS Hilfe und Dokumentation.

%macro names(dsid);
  %let dsid=%sysfunc(open(&dsid, i));
  %let num=%sysfunc(attrn(&dsid,nvars));
  %let varlist=;
  %do i=1 %to &num  ;
    %let varlist=&varlist %sysfunc(varname(&dsid, &i));
  %end;
  %let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
  %put varlist=&varlist;
%mend names;

%names(sasuser.class) ;

Dann bewahren wir die Daten für die Groß- und Kleinschreibung auf, auch wenn Zahlen und Zeichen gemischt werden.

2
Jan Brentved

Ich bin nicht sicher, dass Rawfocus behauptet, dass das Lesen von Dictionary-Tabellen alle Bibliotheken abfragt, wahr ist. Hätte das Beispiel stattdessen sashelp.vcolumn verwendet, dann wäre es zutreffend. Dieser Ansatz ist sehr langsam und greift auf alle zugewiesenen Bibliotheken zu. (Sie können dies mit der Systemoption SAS RTRACE beweisen.)

Ich bin der Meinung, dass eine SQL-Abfrage nach dictionary.columns die schnellste der hier beschriebenen Methoden ist. Offensichtlich würde der makrotierte Code ohne das Makro funktionieren, aber der Punkt des Makros hier ist meiner Meinung nach ein Dienstprogramm. Fügen Sie den Code in Ihre bevorzugte Makrobibliothek ein, und Sie müssen nie wieder darüber nachdenken.

0
Smithers