Exercice de revision
Expliquer ce que font les instructions suivantes :
ma <- matrix(data=runif(50,min=-1,max=2),nrow=10) ma[ abs(ma)<0.2 ] <- NAEcrire des instructions qui affichent le pourcentage de nombre présents par ligne. Voici un exemple de ce qu'on voudrait obtenir :
col01 col02 col03 col04 col05 Valides lig01 0.854 -0.545 1.647 1.264 0.98 100 % lig02 0.825 1.6 1.972 -0.955 -0.401 100 % lig03 <NA> 0.291 -0.282 1.14 1.647 80 % lig04 1.331 0.344 <NA> 0.325 -0.437 80 % lig05 <NA> 0.854 1.299 <NA> 1.838 60 % lig06 1.543 1.945 -0.45 <NA> -0.259 80 % lig07 1.822 1.843 <NA> 0.844 0.273 80 % lig08 1.305 1.597 -0.858 <NA> 1.681 80 % lig09 1.248 0.557 0.75 1.997 1.402 100 % lig10 -0.913 <NA> 1.899 1.919 1.035 80 %Solution
# (gH) -_- revision1.r ; TimeStamp (unix) : 02 Décembre 2013 vers 21:04 ###################################################################################### cats("Version 1") ###################################################################################### # on génére 50 nombres pseudo-aléatoires (tirage uniforme) # compris entre -1 et 2 qu'on met dans une matrice 10x5 ma <- matrix(data=runif(50,min=-1,max=2),nrow=10) # on remplace les valeurs strictement inférieures à 0.2 en valeur absolue # par NA ma[ abs(ma)<0.2 ] <- NA # on commence par nommer les lignes et les colonnes row.names(ma) <- c(paste("lig",sprintf("%02d",1:nrow(ma)),sep="")) colnames(ma) <- c(paste("col",sprintf("%02d",1:ncol(ma)),sep="")) # l'affichage proposé suggère d'arrondir à 3 décimales # comme on veut ajouter une colonne avec des caractères (symbole %) # on convertit en data.frame avant d'ajouter une colonne générée par apply ma <- data.frame(cbind( round(ma,3), apply(X=ma,F=function(x) paste(round(100*sum(!is.na(x))/length(x),0),"%"),M=1) ) # fin de cbind ) # fin de data frame colnames(ma)[ ncol(ma) ] <- "Valides" print(ma) ###################################################################################### cats("Version 2") ###################################################################################### # il pourrait être "raisonnable" de créer une fonction pctValidesF : pctValidesF <- function(x) { # calcule le pourcentage de valeurs non NA # puis renvoie le pourcentage entier suivi du symbole % nbrVal <- sum(!is.na(x)) pctVal <- round(100*nbrVal/length(x),0) pctF <- paste(pctVal,"%") return(pctF) } # fin de fonction pctValidesF ma <- matrix(data=runif(50,min=-1,max=2),nrow=10) ma[ abs(ma)<0.2 ] <- NA row.names(ma) <- c(paste("lig",sprintf("%02d",1:nrow(ma)),sep="")) colnames(ma) <- c(paste("col",sprintf("%02d",1:ncol(ma)),sep="")) ma <- data.frame(cbind( round(ma,3), apply(X=ma,M=1,F=pctValidesF) # remarquer M au lieu de MARGIN et F au lieu de FUN ) # fin de cbind ) # fin de data frame colnames(ma)[ ncol(ma) ] <- "Valides" print(ma)
Retour à la page principale de (gH)