## Calculating mean, mode, median and STD efficiently

Solved
Occasional Contributor
Posts: 12

# 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: 13,498

## Calculating mean, mode, median and STD efficiently

3 of these are easy in a datastep;

data new;

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;

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

## Calculating mean, mode, median and STD efficiently

3 of these are easy in a datastep;

data new;

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: 8,163

## 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 and locked.