Help using Base SAS procedures

Calculating mean, mode, median and STD efficiently

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 12
Accepted Solution

Calculating mean, mode, median and STD efficiently

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?


Accepted Solutions
Solution
‎12-22-2011 05:14 PM
Super User
Posts: 10,535

Calculating mean, mode, median and STD efficiently

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


All Replies
Solution
‎12-22-2011 05:14 PM
Super User
Posts: 10,535

Calculating mean, mode, median and STD efficiently

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;

PROC Star
Posts: 7,364

Calculating mean, mode, median and STD efficiently

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;

Occasional Contributor
Posts: 12

Calculating mean, mode, median and STD efficiently

Thanks guys, it helped!!

☑ This topic is solved.

Need further help from the community? Please ask a new question.

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