DATA Step, Macro, Functions and more

Arrays

Reply
Super Contributor
Posts: 1,041

Arrays

Hi ,

Below I have a list of variables used in the array step

in array one ib is always followed by et

in array two jtb is always followed by jxt

When there are numerous variables like this how can we represent the  in shortcut

something like we do

ib: et:  ??????

data want;

set have;

by mrn1; 

array one {10} ib1 et1 ib2 et2 ib3 et3 ib4 et4 ib5 et5;

array two {10} jtb1 jxt1 jtb2 jxt2 jtb3 jxt3 jtb4 jxt4 jtb5 jxt5;

do i = 1 to dim(one);

end;

run;

Thanks

Super User
Super User
Posts: 7,062

Re: Arrays

Posted in reply to robertrao

Not sure what you want.  Why would it matter that the order is alternating IB and ET variables?

Why not just do

array one ib1-ib5 et1-et5 ;

or

array one ib: et: ;

If you need to treat the IB variables differently than the ET variables then use two different arrays for the two different groups of variables.

array ib ib1-ib5 ;

array et et1-et5;

or

array ib (5);

array et (5);

or

array ib ib: ;

array et et: ;

Or use a two dimensional array

array one (5,2) ib1-ib5 et1-et5 ;

Super Contributor
Posts: 1,041

Re: Arrays

Hi ,

Thnks for the reply.

I am trying to do a transpose using the arrays and ib and et is a pair.

After transpose i will have something like this

data want;

set have;

by mrn1;

array one {10} ib1 et1 ib2 et2 ib3 et3 ib4 et4 ib5 et5;

array two {10} jtb1 jxt1 jtb2 jxt2 jtb3 jxt3 jtb4 jxt4 jtb5 jxt5;

do i = 1 to dim(one);

category=vname(one{i});

value=(one{i});

unit=(two{i});

end;

run;

category   value    unit

ib1

et1

ib2

et2

ib3

et3

ib4

et4

ib5

et5;

Thanks

Super User
Super User
Posts: 7,062

Re: Arrays

Posted in reply to robertrao

array one (5,2) ib1-ib5 et1-et5 ;

array two (5,2) jtb1-jtb5 jtx1-jtx5 ;

do pair=1 to 5;

   do item=1 to 2;

   category=vname(one(pair,item));

   value = one(pair,item);

   unit = two(pair,item);

   output;

  end;

end;

pair item category   value    unit

1 1 ib1

1 2 et1

2 1 ib2

2 2 et2

3 1 ib3

3 2 et3

4 1 ib4

4 2 et4

5 1 ib5

5 2 et5


Regular Contributor
Posts: 195

Re: Arrays

Posted in reply to robertrao

Hi,

Try the following code...

proc contents data = have noprint varnum

              out  = list(keep = name varnum);

run;

proc sort data = list;

   by varnum;

run;

proc sql noprint;

    select name into :grp1 separated by " "

      from list

      where varnum LE 10;

      select name into :grp2 separated by " "

      from list

      where varnum GT 10;

quit;

data want(keep = category value unit);

   array one (*) &grp1.;

   array two (*) &grp2.;

   set have;

   do i = 1 to dim(two);

    category = vname(one(i));

    value = one(i);

    unit = two(i);

        output;

end;

run;

-Urvish

Ask a Question
Discussion stats
  • 4 replies
  • 222 views
  • 0 likes
  • 3 in conversation