<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: find most frequent languages of zipcodes, keep language names and Ns in order for each zip in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973578#M377718</link>
    <description>&lt;P&gt;The following code proposes a different layout for the result. Assuming you want the result in an Excel I'd consider such a layout as easier to work with because you can easily filter by rank to determine which language within a postcode is spoken the most, 2nd and so on frequently.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* 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 */
%let sv_validvarname=%sysfunc(getoption(validvarname,keyword));
options validvarname=any;
proc import 
  datafile="%sysfunc(pathname(work))/source_data.csv"
  dbms=csv
  out=work.have
  replace;
run;
options &amp;amp;sv_validvarname;

/* 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 n_people Language;
run;

proc rank data=work.have_long_sorted out=work.want_ranked ties=dense descending;
  by zip_code;
  ranks rank;
  var n_people;
run;

proc sort data=work.want_ranked;
  by zip_code rank;
run;

proc print data=work.want_ranked;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_0-1756427009841.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/109396i6929BA521E1B09E1/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Patrick_0-1756427009841.png" alt="Patrick_0-1756427009841.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It would also not be hard to exclude the rows with missings or alternatively set the values to zero and/or ensure that for each zip-code all languages get listed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 29 Aug 2025 00:30:39 GMT</pubDate>
    <dc:creator>Patrick</dc:creator>
    <dc:date>2025-08-29T00:30:39Z</dc:date>
    <item>
      <title>find most frequent languages of zipcodes, keep language names and Ns in order for each zip</title>
      <link>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973572#M377716</link>
      <description>&lt;P&gt;I need to find the most frequent languages and number of people speaking those languages in each Zip Code. Have over 2000 Zips.&amp;nbsp; Here is dummy data to illustrate my needs.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Needing to go from Table A:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;Language&lt;/TD&gt;&lt;TD&gt;90001&lt;/TD&gt;&lt;TD&gt;90002&lt;/TD&gt;&lt;TD&gt;90003&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;English&lt;/TD&gt;&lt;TD&gt;35010.55&lt;/TD&gt;&lt;TD&gt;362&lt;/TD&gt;&lt;TD&gt;1201.05&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;French&lt;/TD&gt;&lt;TD&gt;1250.65&lt;/TD&gt;&lt;TD&gt;7805.23&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Spanish&lt;/TD&gt;&lt;TD&gt;2951&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;4835.702&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Chinese&lt;/TD&gt;&lt;TD&gt;130.25&lt;/TD&gt;&lt;TD&gt;520103.07&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Japanese&lt;/TD&gt;&lt;TD&gt;762.79&lt;/TD&gt;&lt;TD&gt;6945.33&lt;/TD&gt;&lt;TD&gt;1234.693&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Russian&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;501.86&lt;/TD&gt;&lt;TD&gt;7485.45&lt;/TD&gt;&lt;TD&gt;9210.252&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To Table B&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ZIP&lt;/TD&gt;&lt;TD&gt;Language_name_1&lt;/TD&gt;&lt;TD&gt;Language_N_1&lt;/TD&gt;&lt;TD&gt;Language_name_2&lt;/TD&gt;&lt;TD&gt;Language_N_2&lt;/TD&gt;&lt;TD&gt;Language_name_3&lt;/TD&gt;&lt;TD&gt;Language_N_3&lt;/TD&gt;&lt;TD&gt;Language_name_4&lt;/TD&gt;&lt;TD&gt;Language_N_4&lt;/TD&gt;&lt;TD&gt;Language_name_5&lt;/TD&gt;&lt;TD&gt;Language_N_5&lt;/TD&gt;&lt;TD&gt;Language_name_6&lt;/TD&gt;&lt;TD&gt;Language_N_6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;90001&lt;/TD&gt;&lt;TD&gt;English&lt;/TD&gt;&lt;TD&gt;35010.55&lt;/TD&gt;&lt;TD&gt;Spanish&lt;/TD&gt;&lt;TD&gt;2951&lt;/TD&gt;&lt;TD&gt;French&lt;/TD&gt;&lt;TD&gt;1250.65&lt;/TD&gt;&lt;TD&gt;Japanese&lt;/TD&gt;&lt;TD&gt;762.79&lt;/TD&gt;&lt;TD&gt;Russian&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;501.86&lt;/TD&gt;&lt;TD&gt;Chinese&lt;/TD&gt;&lt;TD&gt;130.25&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;90002&lt;/TD&gt;&lt;TD&gt;Chinese&lt;/TD&gt;&lt;TD&gt;520103.1&lt;/TD&gt;&lt;TD&gt;French&lt;/TD&gt;&lt;TD&gt;7805.23&lt;/TD&gt;&lt;TD&gt;Russian&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;7485.45&lt;/TD&gt;&lt;TD&gt;Japanese&lt;/TD&gt;&lt;TD&gt;6945.33&lt;/TD&gt;&lt;TD&gt;English&lt;/TD&gt;&lt;TD&gt;362&lt;/TD&gt;&lt;TD&gt;Spanish&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;90003&lt;/TD&gt;&lt;TD&gt;Russian&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;9210.252&lt;/TD&gt;&lt;TD&gt;Spanish&lt;/TD&gt;&lt;TD&gt;4835.702&lt;/TD&gt;&lt;TD&gt;Japanese&lt;/TD&gt;&lt;TD&gt;1234.693&lt;/TD&gt;&lt;TD&gt;English&lt;/TD&gt;&lt;TD&gt;1201.05&lt;/TD&gt;&lt;TD&gt;Chinese&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;TD&gt;French&lt;/TD&gt;&lt;TD&gt;.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Thu, 28 Aug 2025 21:29:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973572#M377716</guid>
      <dc:creator>Cal_Hottie</dc:creator>
      <dc:date>2025-08-28T21:29:09Z</dc:date>
    </item>
    <item>
      <title>Re: find most frequent languages of zipcodes, keep language names and Ns in order for each zip</title>
      <link>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973578#M377718</link>
      <description>&lt;P&gt;The following code proposes a different layout for the result. Assuming you want the result in an Excel I'd consider such a layout as easier to work with because you can easily filter by rank to determine which language within a postcode is spoken the most, 2nd and so on frequently.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* 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 */
%let sv_validvarname=%sysfunc(getoption(validvarname,keyword));
options validvarname=any;
proc import 
  datafile="%sysfunc(pathname(work))/source_data.csv"
  dbms=csv
  out=work.have
  replace;
run;
options &amp;amp;sv_validvarname;

/* 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 n_people Language;
run;

proc rank data=work.have_long_sorted out=work.want_ranked ties=dense descending;
  by zip_code;
  ranks rank;
  var n_people;
run;

proc sort data=work.want_ranked;
  by zip_code rank;
run;

proc print data=work.want_ranked;
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_0-1756427009841.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/109396i6929BA521E1B09E1/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Patrick_0-1756427009841.png" alt="Patrick_0-1756427009841.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It would also not be hard to exclude the rows with missings or alternatively set the values to zero and/or ensure that for each zip-code all languages get listed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 29 Aug 2025 00:30:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973578#M377718</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2025-08-29T00:30:39Z</dc:date>
    </item>
    <item>
      <title>Re: find most frequent languages of zipcodes, keep language names and Ns in order for each zip</title>
      <link>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973579#M377719</link>
      <description>&lt;P&gt;This gets me where I need to be. Thank you!&lt;/P&gt;</description>
      <pubDate>Fri, 29 Aug 2025 00:34:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973579#M377719</guid>
      <dc:creator>Cal_Hottie</dc:creator>
      <dc:date>2025-08-29T00:34:56Z</dc:date>
    </item>
    <item>
      <title>Re: find most frequent languages of zipcodes, keep language names and Ns in order for each zip</title>
      <link>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973604#M377726</link>
      <description>&lt;P&gt;Using Patrick 's dataset .&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* 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 &amp;amp;merge;
 by zip_code;
 drop n;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 29 Aug 2025 07:38:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/find-most-frequent-languages-of-zipcodes-keep-language-names-and/m-p/973604#M377726</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-08-29T07:38:49Z</dc:date>
    </item>
  </channel>
</rss>

