Not applicable
Posts: 1

Array

I have a data set similar to the example at the bottom.  The example represent two sets of variables.  Set #1 is advfnl1 - advfnl6 and set #2 is advfnl1_c - advfnl6_c.

My goal is to create 4 new variables and take the top 2 from the advfnl1 - advfnl6 set and the top 2 from the advfnl1_c - advfnl6_c set...But the top two from each set cannot be a duplicate in the final 4 values saved.

The hierachy is as follows:

1) Always take the first value from advfnl1 and place into "NEWVAR1".

2) The next value comes from advfnl1_c you would place that in 'NEWVAR2' unless it's the same value as 'NEWVAR1'.  If it would be the same value as 'NEWVAR1' then use the value that is in advnl2_c and place that value in "NEWVAR2".

3) Place the value of advfnl2 in "NEWVAR3" unless it's the same value as 'NEWVAR1' or 'NEWVAR2'.  If it is the same value then use advfnl3.

4) Place the value of advfnl2_c in "NEWVAR4" unless it's the same value as 'NEWVAR1' or 'NEWVAR2' or 'NEWVAR3'.  If it is the same value then ues advfnl3_c.

Using the example below (and my logic above) the final results would look like:

 NEWVAR1 NEWVAR2 NEWVAR3 NEWVAR4 34 40 29 49

Let me know if you can assist me in building this array.

Thanks.

Posts: 3,852

Re: Array

Based on what I think you want this is what I came up with.

data id;
length id \$4;

array new[4];
• ;
•    j = 0;

do i = 1 to dim(advfnl);
• );

• if not y then do; j+1; new=advfnl; end;

if j eq dim(new) then leave;

do k = 1 to dim(c_advfnl);

• );
•          if not x then do; j+1; new=c_advfnl; leave; end;

end;

if j eq dim(new) then leave;
end;

drop i j k x y;
cards;
1234 34 29 43 38 12 54   40 29 34 49 54 22
1235 34 29 43 38 12 54   34 29 34 49 54 22
1236 34 29 43 38 12 54   34 29 34 29 34 22
1237 34 29 34 29 12 54   34 29 34 29 34 22
1238 34 29 34 29 12 54   34 34 34 34 34 34
1239 34 29 34 29 29 29   34 34 34 34 34 34
;;;;
run;
run;
Super Contributor
Posts: 307

Re: Array

You state newvar 4 should be 49.

However, your explanation for newvar 4 is: "Place the value of advfnl2_c in "NEWVAR4" unless it's the same value as 'NEWVAR1' or 'NEWVAR2' or 'NEWVAR3'.  If it is the same value then ues advfnl3_c.".

Regardless, you could something like the following logic (which adheres to your explanation -- not your expected result). I've re-named your variables for convenience:

data new ;

merge old1 old2;

by idno;

format newvar1-newvar4 3.;