Valid XHTML     Valid CSS2    

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 ] <- NA
     

Ecrire 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 gH    Retour à la page principale de   (gH)