Saturday, October 17, 2015

R: Which package has this function?

Use the sos package in order to determine which package has a function you need.
library(sos)
findFn("partial residual plots")
 
 

Thursday, October 8, 2015

SAS: Drop variable if it exists



* =============================================================== ;
*         M A C R O   D R O P _ V A R _ I F _ E X I S T S
* =============================================================== ;

%macro drop_var_if_exists(SASFILE=,VAR=);

%* See also http://sasrunner.blogspot.com/2009/09/check-variable-exist-in-data-step-run.html;

data _null_;
dsid = open("&SASFILE");
call symput("var_exists", varnum(dsid, "&VAR"));
rc = close(dsid);
run;

%if (&var_exists eq 0) %then %do;
    %put Variable &VAR does not exist in &SASFILE ;
%end;
%else %do;
    proc sql noprint;
    alter table &SASFILE drop &VAR;
    quit;
    run;
    %put Variable &VAR was dropped from file &SASFILE ;
%end;

%mend drop_var_if_exists;




* =============================================================== ;
*    T E S T   M A C R O   D R O P _ V A R _ I F _ E X I S T S
* =============================================================== ;

* Create test dataset;
data work.mactest;
 set sashelp.class (obs=10);
run;

title "Before drops";
proc print data=work.mactest;
run;
title;

%drop_var_if_exists(SASFILE=work.mactest, VAR=name);
%drop_var_if_exists(SASFILE=work.mactest, VAR=xyz);
%drop_var_if_exists(SASFILE=work.mactest, VAR=age);

title "After drops";
proc print data=work.mactest;
run;
title;

* Done ;




Wednesday, October 7, 2015

SAS: Remove carriage return from string

I had a problem with a dataset with a single string field, created using datalines, and the line ended with carriage return + line feed ('0a0d'x), but code was copied to Linux where it was run, and Linux ends its lines with line feed only ('0a'x), so the field contained the carriage return.  I needed to strip the carriage return from the field. I added this line within the data step that created the file.

  my_field = TRANWRD(my_field,'0D'x,'');




SAS: Hash table lookup

SAS hash table lookup example taken from http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#n1b4cbtmb049xtn1vh9x4waiioz4.htm and included in this bog so I can find it easily.


data match;
   length k 8;
   length s 8;
   if _N_ = 1 then do;
      /* load SMALL data set into the hash object */
     declare hash h(dataset: "work.small");
      /* define SMALL data set variable K as key and S as value */
      h.defineKey('k');
      h.defineData('s');
      h.defineDone();
      /* avoid uninitialized variable notes */
      call missing(k, s);
   end;

/* use the SET statement to iterate over the LARGE data set using */
/* keys in the LARGE data set to match keys in the hash object */
set large;
rc = h.find();
if (rc = 0) then output;
run;






Tuesday, September 15, 2015

SAS: SAS on the Mac

I have little experience with the Mac, and no experience with SAS on the Mac. Some of my students had trouble running SAS on the Mac. One of my students sent me this message. Saving it here just in case...



1. Exit the VM

2. Go to 'Terminal'

3. Type    sudo nvram boot-args=debug=0x10

4. Run the VM again and the bug will be fixed



R: Dataframe slice example

R dataframe slice example.

Note: slice = whole[rows satisfying this condition, tuple of column names]



    > head(mywhole)
      obs ew id ba x
    1   1  E  1  B 8
    2   2  E  1  A 9
    3   3  E  2  B 4
    4   4  E  2  A 3
    5   5  E  3  B 6
    6   6  E  3  A 7
    > myslice = mywhole[ba=="B", c("id","x")]
    > myslice
       id x
    1   1 8
    3   2 4
    5   3 6
    7   4 6
    9   5 5
    11  6 9
    13  7 6
    15  8 5
    17  9 7
    19 10 9





Tuesday, July 7, 2015

SAS: Using "in" within a macro %if



This was new to me…want to use an “in” within a macro “%if”?  Then you need to use the sas option minoperator.  I found a use for it as follows:

options minoperator; * required for in within a macro if ;   
%if (&RUN_TIME_ROUNDED in &GLBL_EMAIL_DASHBOARD_RECON_WHEN) %then %do;

Where

%let GLBL_EMAIL_DASHBOARD_RECON_WHEN = (21600 43200 64800);

Note “in” values are space-delimited. Comma-delimited requires yet another macro option (not system option).  Details at http://support.sas.com/kb/35/591.html