/*-------------------<-- Start of Description-->---------------------\
| Output a SAS dataset to R; |
|---------------------<-- End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<-- Start of Files or Arguments Needed-->---------------|
| Argument: |
| data: the data file you want to output to R; |
| default is the syslast; |
| var: the variable list you want to output; |
| file: the output file path; |
| default is to create a dat file under R directory; |
| header: you want to add a file header to the output file |
|------------<-- Start of Files or Arguments Needed-->---------------|
|--------------------------------------------------------------------|
|------------------<-- Start of Files Created-->---------------------|
| Example: %outr(data = &syslast, var = pt evtstatus days; |
| Usage: outr(data = &syslast, var =, |
| file = C:\Programs\StatSoft\R\rw1060\ud.dat, header = Y); |
\-------------------<-- End of Files Created-->---------------------*/
%macro outr(data = &syslast, var =, where=, file = C:\Programs\StatSoft\R\rw1060\ud.dat, header = Y);
/*--------------------------------------------\
| Copy Right: Duo Zhou; |
| Created: 10-14-2002 9:49pm; |
\--------------------------------------------*/
proc format ;
value na ( default = 15 ) ., .A = 'NA';
value $na (default = 200) ' ' = 'NA'; run;
%if (%quote(&file) ne) and (not %sysfunc(indexw(%upcase(%trim(%quote(%left(%quote(&file))))), %quote(PRINT))))
%then %do; %let file=%sysfunc(dequote(%trim(%quote(%left(%quote(&file)))))); %let file="&file"; %end;
%else %let file=print;
%let _vnames_=;
%if (%quote(&var)=) %then %do;
%let _outrcharvar_=;
%do _vari_=1 %to %nvars(&data);
%if (&_vari_=1) %then %let _vnames_="%trim(%left(%varname(&data, &_vari_)))";
%else %let _vnames_=%trim(%left(&_vnames_)) +1 "%trim(%left(%varname(&data, &_vari_)))";
%if (%vartype(&data, &_vari_) ne 1) %then %do;
%let _outrcharvar_=&_outrcharvar_ %varname(&data, &_vari_);
%end;
%end;
data _null_ ;
%if (%quote(&_outrcharvar_) ne) %then %do;
length &_outrcharvar_ $200.;
format &_outrcharvar_ $200.;
%end;
set &data %if (%quote(&where) ne) %then (where=(&where));;
file &file;
%if %upcase(%substr(&header.,1,1))=Y %then %do;
if _n_ eq 1 then put &_vnames_;
%end;;
%do _vari_=1 %to %nvars(&data);
%if (%vartype(&data, &_vari_)=1) %then %do;
length _char_%trim(%left(%varname(&data, &_vari_))) $200.;
%if (&_vari_=1) %then %do;
if missing(%varname(&data, &_vari_)) then do;
_char_%trim(%left(%varname(&data, &_vari_)))=trimn(left(put(%varname(&data, &_vari_), na.)));
put #_n_ _n_ _char_%trim(%left(%varname(&data, &_vari_))) @@;
end;
else put #_n_ _n_ %varname(&data, &_vari_) @@;
%end;
%else %do;
if missing(%varname(&data, &_vari_)) then do;
_char_%trim(%left(%varname(&data, &_vari_)))=trimn(left(put(%varname(&data, &_vari_), na.)));
put _char_%trim(%left(%varname(&data, &_vari_))) @@;
end;
else put %varname(&data, &_vari_) @@;
%end;
%end;
%else %do;
length %varname(&data, &_vari_) $200.;
if missing(%varname(&data, &_vari_)) then
%varname(&data, &_vari_)='"'||'NA'||'"';
else %varname(&data, &_vari_)='"'||trimn(left(%varname(&data, &_vari_)))||'"';
%if (&_vari_=1) %then %do;
put #_n_ _n_ %varname(&data, &_vari_) @@;
%end;
%else %do;
put %varname(&data, &_vari_) @@;
%end;
%end;
%end;
run;
%end;
%else %do;
%let _outrcharvar_=;
%do _vari_=1 %to %words(&var, dlm=%nrstr((), ));
%let _dummyvar_=%qscan(%quote(&var), &_vari_, %nrstr((), ));
%if (&_vari_=1) %then %let _vnames_="%trim(%left(&_dummyvar_))";
%else %let _vnames_=%trim(%left(&_vnames_)) +1 "%trim(%left(&_dummyvar_))";
%if (%vartype(&data, &_dummyvar_) ne 1) %then %do;
%let _outrcharvar_=&_outrcharvar_ %trim(%left(&_dummyvar_));
%end;
%end;
data _null_ ;
%if (%quote(&_outrcharvar_) ne) %then %do;
length &_outrcharvar_ $200.;
format &_outrcharvar_ $200.;
%end;
set &data;
file &file;
%if %upcase(%substr(&header.,1,1))=Y %then %do;
if _n_ eq 1 then put &_vnames_;
%end;;
%do _vari_=1 %to %words(%quote(&var), dlm=%nrstr((), ));
%let _ivar_=%qscan(%quote(&var), &_vari_, %nrstr((), ));
%if (%vartype(&data, &_ivar_)=1) %then %do;
length _char_%trim(%left(&_ivar_)) $200.;
%if (&_vari_=1) %then %do;
if missing(&_ivar_) then do;
_char_%trim(%left(&_ivar_))=trimn(left(put(&_ivar_, na.)));
put #_n_ _n_ _char_%trim(%left(&_ivar_)) @@;
end;
else put #_n_ _n_ &_ivar_;
%end;
%else %do;
if missing(&_ivar_) then do;
_char_%trim(%left(&_ivar_))=trimn(left(put(&_ivar_, na.)));
put _char_%trim(%left(&_ivar_)) @@;
end;
else put &_ivar_ @@;
%end;
%end;
%else %do;
if missing(&_ivar_) then
&_ivar_='NA';
else &_ivar_=trimn(left(%varname(&data, &_vari_)));
%if (&_vari_=1) %then %do;
put #_n_ _n_ &_ivar_ @@;
%end;
%else %do;
put &_ivar_ @@;
%end;
%end;
%end;
run;
%end;
%mend outr;