Using Patrick 's dataset .
/* create a source .csv file in SAS WORK */
filename src_csv "%sysfunc(pathname(work))/source_data.csv";
data _null_;
file src_csv;
infile datalines truncover;
input;
put _infile_;
datalines;
Language,90001,90002,90003
English,35010.55,362,1201.05
French,1250.65,7805.23,.
Spanish,2951,.,4835.702
Chinese,130.25,520103.07,.
Japanese,762.79,6945.33,1234.693
Russian,501.86,7485.45,9210.252
;
run;
/* import .csv into a SAS table */
options validvarname=any;
proc import
datafile="%sysfunc(pathname(work))/source_data.csv"
dbms=csv
out=work.have
replace;
run;
/* transpose to long data structure */
proc transpose data=work.have out=work.have_long(rename=(_name_=zip_code col1=n_people)) ;
by Language notsorted;
run;
proc sort data=work.have_long out=work.have_long_sorted;
by zip_code descending n_people ;
run;
data x;
set have_long_sorted;
by zip_code;
if first.zip_code then n=0;
n+1;
run;
proc sql noprint;
select distinct catt('x(where=(n=',n,') rename=(language=language_name_',n,' n_people=language_n_',n,'))')
into :merge separated by ' '
from x;
quit;
data want;
if 0 then set x(keep=zip_code);
merge &merge;
by zip_code;
drop n;
run;
... View more