<?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: Transposing dataset by creating variables from substring in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839067#M331748</link>
    <description>&lt;P&gt;In reality, there are about 75 nt variables, the 'notes' always have an even suffix , such as nt2, nt4, nt6....I cannot just call them independently&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 17 Oct 2022 20:15:12 GMT</pubDate>
    <dc:creator>lydiawawa</dc:creator>
    <dc:date>2022-10-17T20:15:12Z</dc:date>
    <item>
      <title>Transposing dataset by creating variables from substring</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839050#M331741</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I have a dataset that I need to transpose by a specific design that involves substring.&lt;/P&gt;&lt;P&gt;The original dataset:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;NT1&lt;/TD&gt;&lt;TD&gt;NT2&lt;/TD&gt;&lt;TD&gt;NT3&lt;/TD&gt;&lt;TD&gt;NT4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;NOTES 12:13:44 03-16-2018&amp;nbsp; CODE: ABC&lt;/TD&gt;&lt;TD&gt;AML&lt;/TD&gt;&lt;TD&gt;NOTES 09:13:11 03-12-2018&amp;nbsp; CODE: OPI&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;NOTES 04:25:09 01-04-2018 CODE: FDS&lt;/TD&gt;&lt;TD&gt;IMD&lt;/TD&gt;&lt;TD&gt;NOTES 03:25:10&amp;nbsp; 01-09-2018 CODE: FGH&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;NOTES 12:22:49 11-12-2018 CODE: DGH&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;TD&gt;NOTES 08:02:49 11-11-2018 CODE: LKO&lt;/TD&gt;&lt;TD&gt;AML&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;NOTES 22:02:21 01-14-2018 CODE: MKL&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;TD&gt;NOTES 07:02:21 01-10-2018 CODE: LOP&lt;/TD&gt;&lt;TD&gt;IMD&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;NOTES 09:01:36 01-23-2018 CODE:&amp;nbsp; HJK&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;TD&gt;NOTES 09:01:56 01-23-2018 CODE: UIY&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Transpose by ID to split out time , date, code and notes:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;time&lt;/TD&gt;&lt;TD&gt;date&lt;/TD&gt;&lt;TD&gt;code&lt;/TD&gt;&lt;TD&gt;notes&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;12:13:44&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;03-16-2018&lt;/TD&gt;&lt;TD&gt;ABC&lt;/TD&gt;&lt;TD&gt;AML&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;09:13:11&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;03-12-2018&lt;/TD&gt;&lt;TD&gt;OPI&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;04:25:09&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-04-2018&lt;/TD&gt;&lt;TD&gt;FDS&lt;/TD&gt;&lt;TD&gt;IMD&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;03:25:10&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-09-2018&lt;/TD&gt;&lt;TD&gt;FGH&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;12:22:49&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;11-12-2018&lt;/TD&gt;&lt;TD&gt;DGH&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;08:02:49&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;11-11-2018&lt;/TD&gt;&lt;TD&gt;LKO&lt;/TD&gt;&lt;TD&gt;AML&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;22:02:21&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-14-2018&lt;/TD&gt;&lt;TD&gt;MKL&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;07:02:21&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-10-2018&lt;/TD&gt;&lt;TD&gt;LOP&lt;/TD&gt;&lt;TD&gt;IMD&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;09:01:36&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-23-2018&lt;/TD&gt;&lt;TD&gt;HJK&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;09:01:56&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;01-23-2018&lt;/TD&gt;&lt;TD&gt;UIY&lt;/TD&gt;&lt;TD&gt;TEST&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;After transposing, ID will have multiple levels based on NT variables.&lt;/P&gt;&lt;P&gt;The code I have so far does not yield the desirable output:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data note11;
 length note0 $50;
 set note10;

  array t{*} nt:;;
    do _i = 1 to dim(t);
/*make sure notes are not blank*/
      if not missing(t[_i]) then note0 = catx('/',note0,vname(t(_i)));
/*timestamp, date, code*/
      if find(upcase(t[_i]),"NOTES") then do;
	 timestamp=substr(left(nt0), index(left(nt0), 'NOTES')+5, 9);                                                                                                              
         date=substr(left(nt0), 15, 10);  
         code = substr(left(nt0), index(left(nt0), 'CODE:')+5); 	
	  end;

    end;
   drop _i;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thank you for any help!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 17 Oct 2022 19:29:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839050#M331741</guid>
      <dc:creator>lydiawawa</dc:creator>
      <dc:date>2022-10-17T19:29:17Z</dc:date>
    </item>
    <item>
      <title>Re: Transposing dataset by creating variables from substring</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839062#M331746</link>
      <description>&lt;P&gt;You can "read" each original observation twice.&amp;nbsp; The first time keeping id nt1 and nt2, the second time keeping id nt3 and nt4.&lt;/P&gt;
&lt;P&gt;Rename nt2 and nt4 to NOTES is simple.&amp;nbsp; Rename nt1 and nt3 to note_text, parse that text for TIME, DATE, and CODE.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Untested, in the absence of a working sample data step:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want (drop=_note_text);
  set have (keep=id nt1 nt2  rename=(nt1=_note_text nt2=notes))
      have (keep=id nt3 nt4  rename=(nt3=_note_text nt4=notes));
  by id;
  length code $4;
  code=scan(_note_text,-1,' ');

  time= input(scan(_note_text,2,' '),time8.0);
  format time time8.0;

  date= input(scan(_note_text,3,' '),mmddyy10.);
  format date mmddyy10. ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;This program assumes&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;time is always the second "word" in _NOTE_TEXT,&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;date is always the third&lt;/LI&gt;
&lt;LI&gt;code is always the last&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The set statement has two references to HAVE, one for NT1 and NT2, the other for NT3 and NT4.&amp;nbsp; This eliminates the need to create a loop to first process NT1 and NT2, then NT3 and NT4.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 17 Oct 2022 20:03:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839062#M331746</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-10-17T20:03:53Z</dc:date>
    </item>
    <item>
      <title>Re: Transposing dataset by creating variables from substring</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839064#M331747</link>
      <description>&lt;P&gt;If this were my data, assuming this is as read, I would go back to the step where I read the data and modify the input statement and basically read the two records from each line.&lt;/P&gt;</description>
      <pubDate>Mon, 17 Oct 2022 20:09:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839064#M331747</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2022-10-17T20:09:23Z</dc:date>
    </item>
    <item>
      <title>Re: Transposing dataset by creating variables from substring</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839067#M331748</link>
      <description>&lt;P&gt;In reality, there are about 75 nt variables, the 'notes' always have an even suffix , such as nt2, nt4, nt6....I cannot just call them independently&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 17 Oct 2022 20:15:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839067#M331748</guid>
      <dc:creator>lydiawawa</dc:creator>
      <dc:date>2022-10-17T20:15:12Z</dc:date>
    </item>
    <item>
      <title>Re: Transposing dataset by creating variables from substring</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839070#M331750</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/30435"&gt;@lydiawawa&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;In reality, there are about 75 nt variables, the 'notes' always have an even suffix , such as nt2, nt4, nt6....I cannot just call them independently&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;"about 75"?&amp;nbsp; &amp;nbsp;Are you saying that you don't have complete pairs (one with the parseable text, the other with the NOTES result)?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you do have complete pairs, and there are many of them, then a loop is the way to go.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Edtted addition:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's say you have 36 complete pairs, saved in variables NT1-NT72.&amp;nbsp; Then the loop approach (untested) could be:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want (drop=nt: row);
  set have;
  length code $4;
  array ntvars {36,2} $ nt1-nt72;

  do row=1 to 36;
    code=scan(ntvars{row,1},-1,' ');
    time= input(scan(ntvars{row,1},2,' '),time8.0);
    format time time8.0;
    date= input(scan(ntvars{row,1},3,' '),mmddyy10.);
    format date mmddyy10. ;

    length notes $4;
    notes=ntvars{row,2};
    output;
  end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 17 Oct 2022 20:29:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Transposing-dataset-by-creating-variables-from-substring/m-p/839070#M331750</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-10-17T20:29:01Z</dc:date>
    </item>
  </channel>
</rss>

