La fonction means() dont voici le programme ci-dessous systématise le calcule de la moyenne en fonction d'une ou plusieurs variables de catégories. Il fournit au passage écart-type et intervalle de confiance, ce qui la rend plus performante en routine que la fonction by().
means = function(data=c(),par=c(),par2=c()) { # Version 2019 - v0.0.8 if ((length(data)==0)| (length(par)==0)){ if ( (length(data)==0)) {cat("Erreur ! Le vecteur ",substitute(data),"est vide.\n")} if ( (length(par)==0)) {cat("Erreur ! Le vecteur ",substitute(par),"est vide.\n")} } else { if (length(par2)>0) { if ( (length(par) != length(data)) | (length(par2) != length(data)) | (length(par) != length(par2)) ) { cat("Erreur ! Les trois vecteurs n'ont pas la même taille.\n") }else { if (length(data[is.na(data)]>0)|length(par[is.na(par)]>0)|length(data[is.na(par2)]>0)) {cat("Attention ! Présence de valeurs vides NA\n")} tab_temp <- na.omit(data.frame(data,par,par2)) data <- tab_temp[,1];par <- tab_temp[,2];par2 <- tab_temp[,3] y = unique(par) ; y2 = unique(par2) matrice = matrix(rep(NA,length(y)*length(y2)), nc=length(y2), nr=length(y), byrow=F) rownames(matrice) = y ; colnames(matrice) = y2 matrice_moyennes = matrice ; matrice_sd = matrice ; matrice_ic = matrice resultat = c() for (i in c(1:length(y2))){ for (j in c(1:length(y))) { temp = data[par2==y2[i]&par==y[j]] matrice_moyennes[j,i] = mean(temp,na.rm = TRUE) if(length(temp)==0){sd_temp=NA} else {sd_temp = sd(temp,na.rm = TRUE)} matrice_sd[j,i] = sd_temp if(length(temp)==0){ic_temp=NA} else {ic_temp = sd(temp,na.rm = TRUE)*1.96/sqrt(length(temp))} matrice_ic[j,i] = ic_temp}} resultat$moyennes = matrice_moyennes resultat$sd = matrice_sd resultat$ic = matrice_ic ; return(resultat)} } else { if (length(par) != length(data)){ cat("Erreur ! Les deux vecteurs n'ont pas la même taille.\n") } else { if (length(data[is.na(data)]>0)|length(par[is.na(par)]>0)) {cat("Attention ! Présence de valeurs vides NA\n")} par = par[!is.na(data)];data = data[!is.na(data)];data = data[!is.na(par)];par = par[!is.na(par)] temp = split(data,par,drop=TRUE) x = c() ; y = sort(unique(par)) ; z = c() ; w = c() ; resultat = list() for (i in c(1:(length(y)))) { x = c(x,mean(temp[[i]],na.rm = TRUE)) if (length(temp[[i]]) > 1) { z = c(z,sd(temp[[i]],na.rm = TRUE)) w = c(w,sd(temp[[i]],na.rm = TRUE)*1.96/sqrt(length(temp[[i]])))} else {z = c(z,NA);w = c(w,NA)} } resultat$moyennes = x[order(y)] ; resultat$sd = z[order(y)] resultat$ic = w[order(y)] ; resultat$parametres = y[order(y)] return(resultat)}}} }# Voir l'exemple de l'application means ci-dessous # Etape 1 - Je colle la fonction means dans le logiciel R (ci-dessus) # Etape 2 - voici des données (exemple) - ici je veux le nombre moyen de colis reçus par jour Nombre_de_colis = rnorm(91,10) ; Jours = rep(c("L","M","M","J","V","S","D"),13) Nombre_de_colis # colis reçus par jour sur une période de 91 jours Jours # Jours concernés # Calcul de ces ces moyennes et intervalles de confiance # Calcule le nombre moyen de colis et l'intervalle de confiance correspondant pour chaque jour étudié. analyse = means(Nombre_de_colis, Jours) analyse # Etape 3 - lecture des résultats # avec analyse$moyennes les moyennes pour chaque jour # analyse$parametres les paramètres propres à chaque moyenne (ici les types de jours) # analyse$sd les écart-types correspondants # analyse$ic les intervalles de confiance correspondants #- - - - - - - Autre exemple plus complexe - - - - - - - # Calculer la taille moyenne en fonction de l'âge et du sexe Taille = rnorm(100,170) ; Age = rep(c(20:39),5) ; Sexe = c(rep("F",50),rep("G",50)) means(Taille,Age,Sexe)