BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
DrZenith
Calcite | Level 5

Hey guys...

I have a dataset like this,

Id      Val1      val2      val3      val4 ......valn     mean     mode      median     std

1        10        20         30          40...    

2         25      13          34          12....

.

.

n

For each row (for each id) i need to find out mean, mode, median and standard deviation and fill the values in the respective columns.

How do I do that efficiently?

1 ACCEPTED SOLUTION

Accepted Solutions
ballardw
Super User

3 of these are easy in a datastep;

data new;

     set <your data>;

     mean = mean (of val1-valn);

     median=median (of val1-valn);

     std = std (of val1-valn);

/* mode could have issues with tie breakers and such the following selects the first VALi */

/* and no claim to efficiency you may want to drop the c1 c2 i and such*/

array v val1-valn;

c2= 0;

do _i_ = 1 to (dim(v) -1);

  c1= 1;

  do _j_ = (_i_+1) to dim(v);

    c1= c1 + (v[_i_]=v[_j_]);

  end;

  if c1 gt c2 then do;

    c2=c1;

    i=_i_;

  end;

  mode= v;

end;

run;

View solution in original post

3 REPLIES 3
ballardw
Super User

3 of these are easy in a datastep;

data new;

     set <your data>;

     mean = mean (of val1-valn);

     median=median (of val1-valn);

     std = std (of val1-valn);

/* mode could have issues with tie breakers and such the following selects the first VALi */

/* and no claim to efficiency you may want to drop the c1 c2 i and such*/

array v val1-valn;

c2= 0;

do _i_ = 1 to (dim(v) -1);

  c1= 1;

  do _j_ = (_i_+1) to dim(v);

    c1= c1 + (v[_i_]=v[_j_]);

  end;

  if c1 gt c2 then do;

    c2=c1;

    i=_i_;

  end;

  mode= v;

end;

run;

art297
Opal | Level 21

The following doesn't account for tied modes either, but you may find it easier to code:

data have;

  input Id  Val1 val2 val3 val4 valn;

  cards;

1  10  20  20  30  40

2  25  13  34  13  25

;

proc transpose data=have out=long;

  var val:;

  by id;

run;

proc summary data=long;

  var col1;

  by id;

  output out=want  mean=mean median=median std=std mode=mode;

run;

DrZenith
Calcite | Level 5

Thanks guys, it helped!!

hackathon24-white-horiz.png

The 2025 SAS Hackathon Kicks Off on June 11!

Watch the live Hackathon Kickoff to get all the essential information about the SAS Hackathon—including how to join, how to participate, and expert tips for success.

YouTube LinkedIn

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 9031 views
  • 5 likes
  • 3 in conversation