R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Summary-funktio

R:ssa on useita tapoja summata dataa ryhmän mukaan. Tällaisia funktioita on mm. aggregate, tapply, summaryBy (doBy-kirjasto), reshape (reshape- ja reshape2-kirjastot), plyr-kiraston monet funktiot ja niin edelleen. Käyttäjät voivat kehittää myös omia summary-funktiota perustuen olemassaoleviin funkitoihin. Tässä yksi esimerkki tällaisestä funktiosta:

set.seed(90) ; v <- rnorm(200, 200, 20) ; g <- factor(rep(LETTERS[1:5],c(50,40,30,60,20)), levels=LETTERS[1:10])
 
group.sum <- gs <- function(v,g, r1=10){
	g <- factor(g) ; lg <- levels(g) ; ng <- length(lg)
	n <- g.mean <- g.med <- g.min <- g.max <- g.sd <-  g.25 <- g.75 <- rep(0,ng+1)
 
	r2 <- r1 ; if( is.integer(v) ){ r2 <- 0 }
		rr1 <- function(x){round(x,r1)}
		rr2 <- function(x){round(x,r2)}
 
 
	for(i in 1:ng){
		vg <- v[g==lg[i]]
		n[i] <- length(vg) ; g.mean[i] <- mean(vg) ; g.sd[i] <- sd(vg)
		g.med[i] <- median(vg) ; g.max[i] <- max(vg) ; g.min[i] <- min(vg)
		g.25[i] <- quantile(vg, .25) ; g.75[i] <- quantile(vg, .75)
	}
	n[ng+1] <- length(v) ; g.mean[ng+1] <- mean(v) ; g.sd[ng+1] <- sd(v)
	g.med[ng+1] <- median(v) ; g.max[ng+1] <- max(v) ; g.min[ng+1] <- min(v)
	g.25[ng+1] <- quantile(v, .25) ; g.75[ng+1] <- quantile(v, .75)
 
 
 
	out <-data.frame(n, rr2(g.min), rr1(g.25), rr1(g.med), rr1(g.75), rr2(g.max), rr1(g.mean), rr1(g.sd),
		row.names=c(lg, 'All'))
	names(out) <- c('n', 'min', '1Q', 'med', '3Q', 'max', 'mean', 'sd')
	out
	}
 
group.sum(v, g)

Tuottaa tulokseksi

> group.sum(v, g)
      n      min       1Q      med       3Q      max     mean       sd
A    50 146.1571 190.8383 199.5061 217.0627 256.3124 202.0157 19.81343
B    40 147.4177 189.1745 201.6346 216.5855 235.4145 200.6358 18.91943
C    30 161.8778 175.2369 194.1860 203.0526 242.2125 192.6343 19.73829
D    60 140.4455 183.5720 194.9892 205.5788 253.1188 194.1375 21.54794
E    20 158.0777 185.7701 196.4419 209.7987 255.3358 197.2386 22.90111
All 200 140.4455 185.4689 197.5980 210.7709 256.3124 197.4913 20.62545
>

Lisättäköön vielä, että funktio ei ole omaa käsialaani, lähdettä en valitettavasti enää muista.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *