Code : Tout sélectionner
tablestat <- function(formula, data= Data, FUN= alist(min, mean, median, max, var, sd, coefvar, sem, confint), prob= 0.95)
{ TABLE <- aggregate(formula, data, length); col <- length(names(TABLE)); names(TABLE)[col] <- "n.tot"
INTER <- aggregate(update(formula,is.na(.)~.), data, sum); TABLE$NAs <- INTER[,col]
INTER <- aggregate(update(formula,!is.na(.)~.), data, sum); TABLE$n.val <- INTER[,col]
INTERsd <- aggregate(formula, data, "sd", na.rm=TRUE)
FUNref <- alist(min,mean,median,max,var,sd,coefvar,sem,confint)
j <- match(FUN,FUNref); index <- col+2
for(i in 1:length(FUN))
{ if(j[i]<6)
{ INTER <- aggregate(formula, data, as.character(FUNref[j[i]]), na.rm=TRUE)
index <- index + 1
TABLE[,index] <- INTER[,col]; names(TABLE)[length(names(TABLE))] <- FUNref[j[i]]
}
if(j[i]==6) {TABLE$sd <- INTERsd[,col]}
if(j[i]==7) {TABLE$coefvar<-INTERsd[,col]/aggregate(formula, data, "mean",na.rm=TRUE)[,col]*100}
if(j[i]==8) {TABLE$sem <- INTERsd[,col]/sqrt(TABLE$n.val)}
if(j[i]==9) {TABLE$confint <- qt((1+prob)/2,df=TABLE$n.val-1) * INTERsd[,col] / sqrt(TABLE$n.val)}
}
return(TABLE)
}
Pour mieux comprendre, voici un exemple:
Code : Tout sélectionner
> data(ToothGrowth)
> myTable <- tablestat(len ~ supp + dose, data=ToothGrowth, FUN= alist(mean, median, sd, coefvar))
> myTable
supp dose n.tot NAs n.val mean median sd coefvar
1 OJ 0.5 10 0 10 13.23 12.25 4.459709 33.70906
2 VC 0.5 10 0 10 7.98 7.15 2.746634 34.41898
3 OJ 1.0 10 0 10 22.70 23.45 3.910953 17.22887
4 VC 1.0 10 0 10 16.77 16.50 2.515309 14.99886
5 OJ 2.0 10 0 10 26.06 25.95 2.655058 10.18825
6 VC 2.0 10 0 10 26.14 25.95 4.797731 18.35398
Les colonnes n.tot, NAs et n.val désignent les effectifs de données totales, manquantes et présentes, respectivement.
Venons en maintenant à ma question:
Les fonctions (comme aggregate) qui utilisent les arguments "formula" et "data" acceptent aussi un argument "subset" bien pratique. Quelqu'un saurait-il comment introduire cet argument dans ma fonction "tablestat" ?