options ls=78 ps=60; data node2; set vwlib.node; /* change blanks to Zs for character data */ 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; /***********************************************************/ /* when all variables are transposed together */ /* transposed numeric variables will automatically be */ /* converted to character */ proc transpose data=node2 out=nodet prefix=var; var node_code--bulky; by id malig_no; run; data nodet; set nodet; /* changes numeric variable from character back */ /* into a numeric */ size=input(node_siz, 5.1); run; /***********************************************************/ /* when numeric and character variables are */ /* transposed separately */ /* character variables */ proc transpose data=node2 out=nodet1; var node_cod site_loc bulky; by id malig_no; run; /* numeric variables */ proc transpose data=node2 out=nodet2; var node_siz; by id malig_no; run; data nodet; merge nodet1 nodet2; by id malig_no; run; /***********************************************************/ /* create a macro to rename */ %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 & &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); data all; merge b c d e; by id malig_no; /* change Zs back to blanks for character data */ array missing {*} node1-node3 site1-site3 size1-size3 bulk1-bulk3; do i=1 to dim(missing); if missing{i}='Z' then missing{i}=''; end; 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; /* combine nodal sites when more than */ /* one of same node for a patient */ 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; %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; run;