/**********************************************************************/


   /* Method 1 */

proc sort data=node1;
   by id malig_no node_cod site_loc;

data temp;
   set node1;
   by id malig_no node_cod site_loc;
   retain site;
   if first.node_cod then site='';
   site=trim(left(site))||site_loc;
   if site not in ('', 'L', 'M', 'R', 'LR') then
      put id= site=; 
   if last.node_cod then output;
   drop site_loc;
   rename site=site_loc;

proc transpose data=temp out=goal1 (drop=_NAME_);
   by id malig_no;
   id node_cod;
   var site_loc;

proc print data=goal1;
   where id in ('1','2');
run;


/**********************************************************************/


   /* Method 2 */

data node2;
   set vwlib.node;
     array missing {*} _CHARACTER_;
     do i=1 to dim(missing);
        if missing{i}='' then missing{i}='Z';
    end;

proc sort data=node2;
   by id node_cod site_loc;

proc print data=node2;
   where id in ('1','2');
run;


/**********************************************************************/


proc transpose data=node2 out=nodet prefix=var;
   var node_cod--bulky;
   by id malig_no;
run;

proc print data=nodet;
   where id in ('1','2');
run;


/**********************************************************************/


%macro r (a, name, new);
   data &a;
   set nodet; 
   by id malig_no;
   %local i;
        %do i=1 %to 3;
            if _NAME_="&name" then
                do;
                   &new&i=var&i;
                   if &i=1 and &new&i='' then delete;
                end;
        else delete;
end;
drop _NAME_ var1-var3;
run;

%mend r;
   %r(b, NODE_COD, node);
   %r(c, SITE_LOC, site);
   %r(d, NODE_SIZ, size);
   %r(e, BULKY   , bulk);


/**********************************************************************/


proc print data=b;
   where id in ('1','2');

proc print data=c;
   where id in ('1','2');

proc print data=d;
   where id in ('1','2');

proc print data=e;
   where id in ('1','2');
run;


/**********************************************************************/


data all;
   merge b c d e;
   by id malig_no;
   array missing {*} node1-node3 site1-site3 size1-size3
                     bulk1-bulk3;
   do i=1 to dim(missing);
      if missing{i}='Z' then missing{i}='';
   end;

proc print data=all;
   where id in ('1','2');
run;


/**********************************************************************/


array valid {3} node1-node3;
a='/'
b='_';
do i=1 to 3;
   if index(valid{i},a) ne 0 then 
   valid{i}=translate(valid{i}, b, a);
end;


/**********************************************************************/


prev_n='    ';
prev_s='    ';
array node{3} node1-node3;
array site{3} site1-site3;
array s{3} s1-s3;
do i=1 to 3;
   s{i}=site{i};
   if node{i}=prev_n then s{i}=trim(prev_s)||site{i};
   if s{i} not in ('', 'L', 'M', 'R', 'LR') then
      put id= s{i}=;
   prev_n=node{i};
   prev_s=site{i};
end;

proc print;
   where id in ('1','2');
   var id node1-node3 s1-s3;
run;


/**********************************************************************/


%macro assign (n, site);
   %local i;
   %let z=sz;
   %let b=bl;
   %do i=1 %to 3;
      if node&i="&n" then 
          do;
             &n=s&i;
             if site&i="&site" then
                do;
                    &site&n&z=size&i;
                    &site&n&b=bulk&i;
                end;
      end;
   %end;
%mend assign;
%assign (AXIL,);
%assign (AXIL, L);
%assign (AXIL, R);

%assign (GAST,);
%assign (GAST, M);

%assign (INGU,);
%assign (INGU, L);
%assign (INGU, R);

drop i prev_n prev_s node1-node3 site1-site3
   s1-s3 size1-size3 bulk1-bulk3;

proc print;
  where id in ('1','2');
run;


/**********************************************************************/