- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I'm sure that this is simple but I'm new to loops and iterations. After spending hours getting nowhere I figured I'd try here.
I would like to rename a set of variables as follows
ExampleA = ExampleA1;
ExampleB = ExampleB1;
output;
But I want the above to do this for 1-9.
easy enough to just copy and change the final number manually but is really like to use a loop or Marco or something...
Any thoughts?
Thanks
G
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I think you need to explain the desire results a little better...
However simple do loop (needs to be enclosed in a Macro and data step)
%do i=1 %to 9 ;
ExampleB&i. = ExampleA&i. ;
%end;
From a simple google "http://support.sas.com/resources/papers/proceedings11/113-2011.pdf"
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I think you are saying that you have 18 existing variables:
ExampleA1 ... ExampleA9
ExampleB1 ... ExampleB9
And you would like to change them into 9 observations with just 2 variables on each observation. If that's the problem you're trying to solve, this would be a viable approach:
data want;
set have;
array a {9} ExampleA1 - ExampleA9;
array b {9} ExampleB1 - ExampleB9;
do _n_=1 to 9;
ExampleA = a{_n_};
ExampleB = b{_n_};
output;
end;
keep ExampleA ExampleB;
run;
Of course, if you're trying to accomplish something different, that's another story.
Good luck.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the reply. You stated my intention correctly.
I came up with the following which gave me what I wanted though I found it slightly more cumbersome to program. If you would no mind having a look at this as well as the Macro version that I posted in reply to Barry and letting me know if you see a benefit to one version over another, I'd appreciate it.
This was great though as I've been meaning to learn arrays. I'll be dissecting this and learning how it works tomorrow:
data ArrayTest (keep=SubjectID VisitDate Initials Age TeamReferred SelfReferred
PfPositive PfDensity EpisodeNumber Antimalarials Comments);
set data9;
array a {5} MalariaLogID1-MalariaLogID5;
array b {5} MalariaEpisodeDate1-MalariaEpisodeDate5;
array c {5} PatientInitials1-PatientInitials5;
array d {5} PatientAge1-PatientAge5;
array e {5} ReferredByStudyTeam1-ReferredByStudyTeam5;
array f {5} SelfReferral1-SelfReferral5;
array g {5} PfPositive1-PfPositive5;
array h {5} PfDens1-PfDens5;
array i {5} EpisodeNumber1-EpisodeNumber5;
array j {5} AntimalarialProvided1-AntimalarialProvided5;
array k {5} Comments1-Comments5;
do n =1 to 5;
SubjectID=a{n};
VisitDate=b{n};
Initials=c{n};
Age=d{n};
TeamReferred=e{n};
SelfReferred=f{n};
PfPositive=g{n};
PfDensity=h{n};
EpisodeNumber=i{n};
Antimalarials=j{n};
Comments=k{n};
output;
format VisitDate MMDDYY10.;
format SubjectID ML_format.;
run;
data ArrayTest;
set ArrayTest;
if SubjectID="" then delete;
run;
proc sort data=Arraytest;
by SubjectID;
run;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I think you need to explain the desire results a little better...
However simple do loop (needs to be enclosed in a Macro and data step)
%do i=1 %to 9 ;
ExampleB&i. = ExampleA&i. ;
%end;
From a simple google "http://support.sas.com/resources/papers/proceedings11/113-2011.pdf"
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the tip.
I had read that article and, at first thought that my leaving the "." out after the "i" was causing this not to work. With or without the period, I was getting the same result of 176 observations instead of the expected 848. I finally noticed that my output statement was outside of the Do loop rather than within it which created the missing observation problem. Once I fixed that, I got the expected results.
To answer your question, user Astounding was correct in assuming that I had several variables 1-5 (not 9) that I wanted condensed. My initial code worked fine but the Macro version is shorter less error prone. I've posted the initial code followed by the working macro version:
INITIAL (obnoxiously long) CODE:
data Log (keep=SubjectID VisitDate Initials Age TeamReferred SelfReferred PfPositive PfDensity EpisodeNumber Antimalarials Comments);
set data9;
SubjectId=MalariaLogID1;
VisitDate=MalariaEpisodeDate1;
Initials=PatientInitials1;
Age=PatientAge1;
TeamReferred=ReferredByStudyTeam1;
SelfReferred=SelfReferral1;
PfPositive=PfPositive1;
PfDensity=PfDens1;
EpisodeNumber=EpisodeNumber1;
Antimalarials=AntimalarialProvided1;
Comments=Comments1;
output;
SubjectId=MalariaLogID2;
VisitDate=MalariaEpisodeDate2;
Initials=PatientInitials2;
Age=PatientAge2;
TeamReferred=ReferredByStudyTeam2;
SelfReferred=SelfReferral2;
PfPositive=PfPositive2;
PfDensity=PfDens2;
EpisodeNumber=EpisodeNumber2;
Antimalarials=AntimalarialProvided2;
Comments=Comments2;
output;
SubjectId=MalariaLogID3;
VisitDate=MalariaEpisodeDate3;
Initials=PatientInitials3;
Age=PatientAge3;
TeamReferred=ReferredByStudyTeam3;
SelfReferred=SelfReferral3;
PfPositive=PfPositive3;
PfDensity=PfDens3;
EpisodeNumber=EpisodeNumber3;
Antimalarials=AntimalarialProvided3;
Comments=Comments3;
output;
SubjectId=MalariaLogID4;
VisitDate=MalariaEpisodeDate4;
Initials=PatientInitials4;
Age=PatientAge4;
TeamReferred=ReferredByStudyTeam4;
SelfReferred=SelfReferral4;
PfPositive=PfPositive4;
PfDensity=PfDens4;
EpisodeNumber=EpisodeNumber4;
Antimalarials=AntimalarialProvided4;
Comments=Comments4;
output;
SubjectId=MalariaLogID5;
VisitDate=MalariaEpisodeDate5;
Initials=PatientInitials5;
Age=PatientAge5;
TeamReferred=ReferredByStudyTeam5;
SelfReferred=SelfReferral5;
PfPositive=PfPositive5;
PfDensity=PfDens5;
EpisodeNumber=EpisodeNumber5;
Antimalarials=AntimalarialProvided5;
Comments=Comments5;
output;
format VisitDate MMDDYY10.;
format SubjectID ML_format.;
run;
data Log;
set Log;
if SubjectID="" then delete;
run;
proc sort data=Log;
by SubjectID;
run;
SHORT MACRO VERSION:
%macro MacroTest;
data MacroTest (keep=SubjectID VisitDate Initials Age TeamReferred SelfReferred
PfPositive PfDensity EpisodeNumber Antimalarials Comments);
set data9;
%DO i = 1 %to 5;
SubjectId=MalariaLogID&i;
VisitDate=MalariaEpisodeDate&i;
Initials=PatientInitials&i;
Age=PatientAge&i;
TeamReferred=ReferredByStudyTeam&i;
SelfReferred=SelfReferral&i;
PfPositive=PfPositive&i;
PfDensity=PfDens&i;
EpisodeNumber=EpisodeNumber&i;
Antimalarials=AntimalarialProvided&i;
Comments=Comments&i;
output;
%end;
format VisitDate MMDDYY10.;
format SubjectID ML_format.;
run;
data MacroTest;
set MacroTest;
if SubjectID="" then delete;
run;
proc sort data=MacroTest;
by SubjectID;
run;
%Mend MacroTest;