<?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: How to TRANSPOSE Orderly? in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702739#M215256</link>
    <description>&lt;P&gt;Do this&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort
  data=have (keep=i)
  out=template
  nodupkey
;
by i;
run;

data pretrans/view=pretrans;
set
  template
  have
;
run;

proc transpose
  data=pretrans
  prefix=x
  out=now (drop=_name_ where=(t ne .))
;
by t;
id i;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;(untested, posted from my tablet)&lt;/P&gt;</description>
    <pubDate>Tue, 01 Dec 2020 06:26:52 GMT</pubDate>
    <dc:creator>Kurt_Bremser</dc:creator>
    <dc:date>2020-12-01T06:26:52Z</dc:date>
    <item>
      <title>How to TRANSPOSE Orderly?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702726#M215248</link>
      <description>&lt;P&gt;I want to &lt;CODE&gt;transpose&lt;/CODE&gt; the following data set—the following is the working example, but the real data set has more than five &lt;CODE&gt;i&lt;/CODE&gt;s (and the&amp;nbsp;&lt;CODE&gt;i&lt;/CODE&gt;s are non-continuous).&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
	input i t x;
cards;
1 1 -0.43
1 2 1.45
1 3 0.78
2 3 0.43
2 4 -0.76
2 5 0.08
2 6 0.31
2 7 -1.39
3 2 -1.79
3 3 0.62
3 4 0.66
3 5 -0.96
3 6 0.29
3 7 -2.13
3 8 -0.58
3 9 -2.59
3 10 -0.34
3 11 -0.17
3 12 -0.66
4 1 -2.28
4 2 1.8
4 3 1.45
4 4 -1.19
4 5 1.13
4 6 0.59
4 7 -0.67
5 3 -0.92
5 4 -0.84
5 5 -0.11
5 6 -1.47
;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;The easiest way may be &lt;CODE&gt;sort&lt;/CODE&gt; and then &lt;CODE&gt;transpose&lt;/CODE&gt; as follows.&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort out=now;
	by t i;
run;

proc transpose prefix=x out=now(drop=_name_);
	by t;
	id i;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;The problem is the resultant variable order—&lt;CODE&gt;transpose&lt;/CODE&gt; locates &lt;CODE&gt;x4&lt;/CODE&gt; first because &lt;CODE&gt;x2&lt;/CODE&gt; and &lt;CODE&gt;x3&lt;/CODE&gt; have no observation at &lt;CODE&gt;t=1&lt;/CODE&gt;.&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;t&lt;/TD&gt;&lt;TD&gt;x1&lt;/TD&gt;&lt;TD&gt;x4&lt;/TD&gt;&lt;TD&gt;x3&lt;/TD&gt;&lt;TD&gt;x2&lt;/TD&gt;&lt;TD&gt;x5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;-0.43&lt;/TD&gt;&lt;TD&gt;-2.28&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1.45&lt;/TD&gt;&lt;TD&gt;1.8&lt;/TD&gt;&lt;TD&gt;-1.79&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;0.78&lt;/TD&gt;&lt;TD&gt;1.45&lt;/TD&gt;&lt;TD&gt;0.62&lt;/TD&gt;&lt;TD&gt;0.43&lt;/TD&gt;&lt;TD&gt;-0.92&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-1.19&lt;/TD&gt;&lt;TD&gt;0.66&lt;/TD&gt;&lt;TD&gt;-0.76&lt;/TD&gt;&lt;TD&gt;-0.84&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;1.13&lt;/TD&gt;&lt;TD&gt;-0.96&lt;/TD&gt;&lt;TD&gt;0.08&lt;/TD&gt;&lt;TD&gt;-0.11&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;0.59&lt;/TD&gt;&lt;TD&gt;0.29&lt;/TD&gt;&lt;TD&gt;0.31&lt;/TD&gt;&lt;TD&gt;-1.47&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-0.67&lt;/TD&gt;&lt;TD&gt;-2.13&lt;/TD&gt;&lt;TD&gt;-1.39&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-0.58&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-2.59&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-0.34&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-0.17&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;-0.66&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;The following code orderly locates all the &lt;CODE&gt;i&lt;/CODE&gt;s but will be inconvenient if there are too many &lt;CODE&gt;i&lt;/CODE&gt;s I need to code.&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want(drop=i);
	merge have(where=(i=1) rename=(x=x1))
		have(where=(i=2) rename=(x=x2))
		have(where=(i=3) rename=(x=x3))
		have(where=(i=4) rename=(x=x4))
		have(where=(i=5) rename=(x=x5));
	by t;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Or I can use longer &lt;CODE&gt;%macro&lt;/CODE&gt; as follows, but this version will be inaccurate as well if the macro variable list exceeds 65,534 characters.&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro long;

proc sql noprint;
	select distinct i into :i separated by " " from have;
quit;

data long(drop=i);
	merge%do j=1 %to %sysfunc(countw(&amp;amp;i)); have(where=(i=%scan(&amp;amp;i,&amp;amp;j)) rename=(x=x%scan(&amp;amp;i,&amp;amp;j)))%end;;
	by t;
run;

%mend;

%long&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Is there a better solution?&lt;/P&gt;</description>
      <pubDate>Tue, 01 Dec 2020 04:05:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702726#M215248</guid>
      <dc:creator>Junyong</dc:creator>
      <dc:date>2020-12-01T04:05:35Z</dc:date>
    </item>
    <item>
      <title>Re: How to TRANSPOSE Orderly?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702739#M215256</link>
      <description>&lt;P&gt;Do this&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort
  data=have (keep=i)
  out=template
  nodupkey
;
by i;
run;

data pretrans/view=pretrans;
set
  template
  have
;
run;

proc transpose
  data=pretrans
  prefix=x
  out=now (drop=_name_ where=(t ne .))
;
by t;
id i;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;(untested, posted from my tablet)&lt;/P&gt;</description>
      <pubDate>Tue, 01 Dec 2020 06:26:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702739#M215256</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-12-01T06:26:52Z</dc:date>
    </item>
    <item>
      <title>Re: How to TRANSPOSE Orderly?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702741#M215257</link>
      <description>&lt;P&gt;Thanks, but cannot &lt;CODE&gt;transpose&lt;/CODE&gt; &lt;CODE&gt;pretrans&lt;/CODE&gt; because unsorted—but can understand the approach (appending &lt;CODE&gt;template&lt;/CODE&gt;&amp;nbsp;first as nametags).&lt;/P&gt;</description>
      <pubDate>Tue, 01 Dec 2020 07:00:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702741#M215257</guid>
      <dc:creator>Junyong</dc:creator>
      <dc:date>2020-12-01T07:00:43Z</dc:date>
    </item>
    <item>
      <title>Re: How to TRANSPOSE Orderly?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702756#M215260</link>
      <description>&lt;P&gt;Do you actually need a data set?&lt;/P&gt;
&lt;P&gt;If so, what are you doing that is column order dependent? SAS data sets and procedures really don't care about column order for a vast majority of processes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you need a report, that is something people read and get picky about column order maybe:&lt;/P&gt;
&lt;PRE&gt;proc report data=have;
   column t i,x;
   define t /group;
   define i/across;
run;&lt;/PRE&gt;</description>
      <pubDate>Tue, 01 Dec 2020 08:24:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702756#M215260</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2020-12-01T08:24:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to TRANSPOSE Orderly?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702760#M215261</link>
      <description>&lt;P&gt;We need to incorporate the sort into the process:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input i t x;
cards;
1 1 -0.43
1 2 1.45
1 3 0.78
2 3 0.43
2 4 -0.76
2 5 0.08
2 6 0.31
2 7 -1.39
3 2 -1.79
3 3 0.62
3 4 0.66
3 5 -0.96
3 6 0.29
3 7 -2.13
3 8 -0.58
3 9 -2.59
3 10 -0.34
3 11 -0.17
3 12 -0.66
4 1 -2.28
4 2 1.8
4 3 1.45
4 4 -1.19
4 5 1.13
4 6 0.59
4 7 -0.67
5 3 -0.92
5 4 -0.84
5 5 -0.11
5 6 -1.47
;

proc sort
  data=have
;
by t i;
run;

proc sort
  data=have (keep=i)
  out=template
  nodupkey
;
by i;
run;

data pretrans/view=pretrans;
set
  template
  have
;
run;

proc transpose
  data=pretrans
  prefix=x
  out=want (drop=_name_ where=(t ne .))
;
by t;
id i;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Code is now tested.&lt;/P&gt;</description>
      <pubDate>Tue, 01 Dec 2020 08:30:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-TRANSPOSE-Orderly/m-p/702760#M215261</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-12-01T08:30:50Z</dc:date>
    </item>
  </channel>
</rss>

