This works, assuming only one possible valid_value for each crossing of Variable (as per your desired output). data have ; infile datalines dlm=',' dsd; informat documentation_vv occupancy_vv property_vv purpose_vv $50.; input documentation_invalid documentation_vv $ occupancy_invalid occupancy_vv $ property_invalid property_vv $ purpose_invalid purpose_vv $ ; datalines ; 0,"FULL, SUB, VOI/VOA, NODOC, QUICK",0,"OWNER, 2NDHOME, INVESTOR",1,"SF, MF, TOWNHOUSE, CONDO",0,"PURCHASE, CASHOUT, RATE/TERM" 0,"FULL, SUB, VOI/VOA, NODOC, QUICK",1,"OWNER, 2NDHOME, INVESTOR",0,"SF, MF, TOWNHOUSE, CONDO",0,"PURCHASE, CASHOUT, RATE/TERM" 0,"FULL, SUB, VOI/VOA, NODOC, QUICK",0,"OWNER, 2NDHOME, INVESTOR",0,"SF, MF, TOWNHOUSE, CONDO",0,"PURCHASE, CASHOUT, RATE/TERM" 0,"FULL, SUB, VOI/VOA, NODOC, QUICK",0,"OWNER, 2NDHOME, INVESTOR",0,"SF, MF, TOWNHOUSE, CONDO",0,"PURCHASE, CASHOUT, RATE/TERM" 1,"FULL, SUB, VOI/VOA, NODOC, QUICK",0,"OWNER, 2NDHOME, INVESTOR",0,"SF, MF, TOWNHOUSE, CONDO",1,"PURCHASE, CASHOUT, RATE/TERM" 0,"FULL, SUB, VOI/VOA, NODOC, QUICK",0,"OWNER, 2NDHOME, INVESTOR",0,"SF, MF, TOWNHOUSE, CONDO",0,"PURCHASE, CASHOUT, RATE/TERM" ; ;;;; /* transpose numeric variables */ proc transpose data=have out=counts name=Variable; run ; /* cleanup */ data counts ; set counts ; drop col1-col6; tot_count = n ( of col1-col6 ); valid_count = sum ( of col1-col6 ) ; invalid_count = tot_count - valid_count ; run ; /* transpose character vars */ proc transpose data=have out=valid_values name=Variable; var documentation_vv occupancy_vv property_vv purpose_vv ; run ; /* cleanup */ data valid_values ; set valid_values ; drop col2-col6; rename col1=valid_values; run ; /* merge */ proc sql ; create table want as select t1.*, t2.valid_values from counts t1 , valid_values t2 where substr ( t1.variable , 1, 8 ) = substr ( t2.variable , 1, 8 ) ; quit; Message was edited by: Michael McCormick
... View more