How do you add a prefix to some or all variables in a
dataset using a SAS macro?
Answers were Sorted based on User's Feedback
Answer / kumar
If it is Interview Question I would do say something like this.
/* Running the renaming macro */
options macrogen mprint mlogic;
%macro rename(lib,dsn);
options pageno=1 nodate;
proc contents data=&lib..&dsn;
title "Before Renaming All Variables";
run;
proc sql noprint;
select nvar into :num_vars
from dictionary.tables
where libname="&LIB" and
memname="&DSN";
select distinct(name) into :var1-
:var%TRIM(%LEFT(&num_vars))
from dictionary.columns
where libname="&LIB" and
memname="&DSN";
quit;
run;
proc datasets library=&LIB;
modify &DSN;
rename
%do i=1 %to &num_vars;
&&var&i=NEWNAME_&&var&i.
%end;
;
quit;
run;
options pageno=1 nodate;
proc contents data=&lib..&dsn;
title "After Renaming All Variables";
run;
%mend rename;
| Is This Answer Correct ? | 4 Yes | 0 No |
Answer / sastechies
Often we need to add a prefix to some or all variables in a
dataset before we might have to merge datasets that have
similar column attributes...This macro would allow you to
do that....
Try it for yourself....
/**
SAS Macro to add a prefix to some or all variables in a
data set...
to be used like this...
%prefixvars(inpdsn,prefix,outdsn,excludevars=);
inpdsn - input dataset name libname.dsnname
prefix - prefix that you want to assign
outdsn - output dataset name libname.dsnname
excludevars - vars that you do not want to rename with the
prefix
**/
%macro prefixvars(inpdsn,prefix,outdsn,excludevars=);
/* split the excludevars into individual macro var names
for later use*/
%let num=1;
%let excludevar=%scan(%upcase(&excludevars),&num,' ');
%let excludevar&num=&excludevar;
%do %while(&excludevar ne );
%let num=%eval(&num + 1);
%let excludevar=%scan(&excludevars,&num,' ');
%let excludevar&num=&excludevar;
%end;
%let numkeyvars=%eval(&num - 1); /* this is number of
variables given in the exclude vars */
%let dsid=%sysfunc(open(&inpdsn)); /* open the dataset
and get the handle
*/
%let numvars=%sysfunc(attrn(&dsid,nvars)); /* get the
number of variables
*/
data
&outdsn;
set &inpdsn(rename=(
/*rename all the variables that are not in the
excludevars=
*/
%do i = 1 %to &numvars;
%let flag=N;
%let var&i=%sysfunc(varname(&dsid,&i));
%do j=1 %to &numkeyvars;
%if %upcase(&&var&i) eq &&excludevar&j %then %
let flag=Y;
%end;
%if &flag eq N %then %do;
&&var&i=&prefix&&var&i %end;
%
end;));
%let rc=%sysfunc(close
(&dsid));
run;
%mend
prefixvars;
/*Call the macro
now*/
%prefixvars
(sashelp.buy,fr_,work.out,excludevars=date)
| Is This Answer Correct ? | 3 Yes | 1 No |
What are the special input delimiters used in SAS?
Explain proc univariate?
I have a SCD Type 2 Dimention for Location In which A Sales Office in Having two Surrogate Keys just because of the change in it's Sales Group. SKey SalesGroup Sales Office BeginDate EndDate 280 SG1 SO1 01APR2000 01APR2010 281 SG2 SO1 02APR2010 31MAR2999 Now while loading the Fact, the Lookup ir returning SKey 280 for records before and after 01APR2010. I am not able to give WHERE condition in the Lookup Properties (TranDate between BeginDate and EndDate). Please help.
hi guys ...i have one query... data abc; input s w k g o t a m; cards; 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 ; run; i want the output to be the sorted order(only variables).observations should not be changed..
HOW MANY WAYS YOU CAN RETRIEVE THE DATA FROM ORACLE TABLES? WHAT IS ORACLE CLINICAL? HOW IT IS USEFUL?
3 Answers Accenture, Novartis,
why a stop statement is needed for the point= option on a set statement?
At compile time when a SAS data set is read, what items are created?
i have a data set with 20 observations i want label from 8 to 15 observations ? how you create this one.
which stats created by proc means that are not created by proc summary or vice versa?
What does proc print, and proc contents are used for?
what are all the reports you generated in your recent project?
0 Answers Accenture, Quintiles,
how can u join the two tables without using proc sql Joins and nested queries ?