Sometimes we would want to list column names of a SAS dataset, which can be useful in other programs, such as
In other programming languages like R, it’s very easy and convenient to show column names as following:
> names(iris)  "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" > colnames(iris)  "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
In SAS, as I know, maybe there are two approaches to accomplish the same purpose.
One way is to use
proc contents, which seems very straightforward.
proc contents data = sashelp.class; run;
If we want to store them in a new table (dataset), it can be used like this.
proc contents data = sashelp.class memtype = data out = cols nodetails noprint; run;
The second way to list the column names is with the use of a direction table. That way is also very common for other purposes.
I learned from Google that we can use either
proc data or
proc sql procedure.
proc data step,
sashelp.vcolumn is a view on the direction table, so it's just like to filter the rows of
data columns; set sashelp.vcolumn; where libname = 'sashelp' and memname = 'class'; run;
If we would like to save the column names as a macro variable, then I feel
proc sql is a better solution. So it corresponds to the
proc sql; select name into: cols seperated by ' ' from dictionary.columns where libname = 'SASHELP' and memname = 'CLASS'; quit; %put &cols;
If you're not sure which column variable is what you want, try the
proc sql; describe table dictionary.columns; quit; /* output, not run */ create table DICTIONARY.COLUMNS ( libname char(8) label='Library Name', memname char(32) label='Member Name', memtype char(8) label='Member Type', name char(32) label='Column Name', type char(4) label='Column Type', length num label='Column Length', npos num label='Column Position', varnum num label='Column Number in Table', label char(256) label='Column Label', format char(49) label='Column Format', informat char(49) label='Column Informat', idxusage char(9) label='Column Index Type', sortedby num label='Order in Key Sequence', xtype char(12) label='Extended Type', notnull char(3) label='Not NULL?', precision num label='Precision', scale num label='Scale', transcode char(3) label='Transcoded?', diagnostic char(256) label='Diagnostic Message from File Open Attempt' );
By now we get the macro variable called
cols, then it can be used in any procedure like
proc freq data = sashelp.class nlevels; tables &cols; run;
Do you think which one is the better solution? It’s no doubt that it depends on your actual case.
Please indicate the source: http://www.bioinfo-scrounger.com