The macro solutions are great for such problems. Incidentally, the hash-of-hashes (HOH) technique was first demonstrated by Richard DeVenezia for dataset splitting. I have used a similar HOH approach, using dataset functions to read in data: data have; infile datalines dsd dlm=" "; input Years $ (pf1-pf8) ($); datalines; 2006 0,99995 0,99984 0,99969 0,99954 0,99939 0,99924 0,99909 0,99894 0,99864 2007 0,90419475 0,86805513 0,95407293 0,8676255 0,9106782 0,89055109 0,99534984 0,82628474 0,85245713 2008 0,9547502 0,86854718 0,80312147 0,94014155 0,92665103 0,97910746 0,95293207 0,94262974 0,86068283 2009 0,84331363 0,81522629 0,98906643 0,88725626 0,94812541 0,85975439 0,93789548 0,98424024 0,82137827 2010 0,83663445 0,84507837 0,91888898 0,95447863 0,87323238 0,98027643 0,93558909 0,85553856 0,97474632 2011 0,86543087 0,9058221 0,80951478 0,97289518 0,80704643 0,94382676 0,89678733 0,93423198 0,89965292 2012 0,91703081 0,88559104 0,8006615 0,89746979 0,96224727 0,93283978 0,99704944 0,95622047 0,92032314 ; run; data _null_; length pf $15; if(1=2) then set have; declare hash p (ordered:"a"); p.defineKey("years"); p.defineData("years","ObjPF"); p.defineDone(); declare hiter hip("p"); declare hash ObjPF; *****Bring in data using data access functions**********************; dsid=open("have"); nrows=attrn(dsid,"NOBS"); ncols=attrn(dsid,"NVAR"); do x=1 to nrows; rc=fetchobs(dsid,x); years=getvarc(dsid,1); nametext="YR"||strip(left(years)); rc=fetchobs(dsid,x); do y=2 to ncols; pf=getvarc(dsid,y); ***** Create Hash-of-Hashes*********************************; if p.find() ne 0 then do; ObjPF=_new_ hash(ordered:"a",multidata:"y"); ObjPF.defineKey("y"); ObjPF.defineData("pf"); ObjPF.defineDone(); p.replace(); end; *for p.find; ObjPF.replace(); end; *for y; end; *for x; ****hash-of-hashes readout and dataset creation*********************; do rc = hip.first() by 0 while (rc = 0); ObjPF.output (dataset:'YR_'||years); rc = hip.next(); end; *for hip.first; stop; run;
... View more