# Chemin à ajuster # mi <- read.table("../data/mi.csv", sep = ",", header = TRUE) setwd("/home/blaise/Documents/Cours/R_pasteur_phd") # Création d'un dossier pour sauver les résultats dir.create("test_results") # On charge le tableau de données sous forme de data frame # Bonne pratique: vérifier les options: # ?read.table mi <- read.table("data/mi.csv", sep = ",", header = TRUE) # On peut visualiser dans RStudio # View(mi) # On peut aussi voir des informations dans l'environnement # Et aussi avec des commandes R, comme str: str(mi) # Changer l'ordre des niveaux d'un facteur ########################################### # Quels sont les niveaux de revenus définis ? levels(mi$Income) # On aimerait plutôt avoir l'ordre suivant (plus bas revenus en premier): levels(mi$Income)[c(4, 1, 2, 3)] # Ajout d'une nouvelle colonne pour les revenus, # où les niveaux du facteur mi$Income ont été réordonnés mi$Income_fixed <- factor(mi$Income, levels(mi$Income)[c(4, 1, 2, 3)]) # On veut que la figure aille dans un pdf # Vérification des niveaux de revenus levels(mi$Income_fixed) # Sauver le tableau modifié dans un fichier. # Au format TSV, pour changer. # Bonne pratique: vérifier les options: # ?write.table write.table(mi, "test_results/mi_fixed.tsv", sep = "\t", quote = FALSE) # Plusieurs figures, les sauver ################################ # Bonne pratique: vérifier les options: # ?par # Figure à 3 graphes les uns en dessous des autres ################################################### # Ouverture d'un fichier pdf pdf("test_results/Income_BMI.pdf") # On demande les graphiques sur 3 lignes et 1 colonne par(mfrow = c(3, 1)) # Distribution des indices de masse corporelle hist(mi$BMI) # Distribution des revenus barplot(table(mi$Income_fixed)) # Visualisation synthétique des distributions # d'indices de masse corporelle pour chaque classe de revenus boxplot(mi$BMI~mi$Income_fixed) # On ferme le pdf dev.off() # Figure à deux graphes superposés ################################### # Ouverture d'un fichier pdf pdf("test_results/Age_effect.pdf") # On veut maintenant une seule figure par(mfrow = c(1, 1), # Avec de la marge en plus à droite pour le 2e axe oma = c(0, 0, 0, 2)) # Indices de masse corporelle en fonction de l'âge # "+" bleu plot(x = mi$Age, y = mi$BMI, pch = 3, col = "blue", xlab = "Age", ylab = "BMI") # On veut superposer un deuxième graphe par(new = TRUE) # Rythme cardiaque en fonction de l'âge # Il va faloir gérer "à la main" les axes. # "x" orange plot(x = mi$Age, y = mi$HeartRate, pch = 4, col = "orange", axes = FALSE, xlab = "", ylab = "") # On met l'axe à droite axis(side = 4) # On ajoute une étiquette pour cet axe mtext("Heart rate", # Texte à droite side = 4, # sur la "troisième" marge line = 3) # On ferme le pdf dev.off() # Boucles ########## v <- c(4, 2, 0) # Affichage et utilisation d'une variable de boucle for (i in v) { # Entre accolades, les instructions à exécuter plusieurs fois # À chaque tour, i a une valeur différente: print(paste("i: ", i)) print(paste("i²: ", i^2)) } # Boucle avec "accumulateurs" # Vecteur vide qu'on va augmenter au fur et à mesure pays <- c() # Nombre qui nous permet de compter les tours de boucle i <- 0 for (prefix in c("Pak", "Afghan", "Turkmen", "Tadjik")) { print(i) print(pays) pays <- c(pays, paste0(prefix, "istan")) i <- i + 1 } print("Fini") print(i) print(pays) # Fonction # Ici, on définit la fonction, et on la met dans une variable nom_de_la_fonction <- function(argument_1, argument_2) { print("Ici, la fonction est en train de s'exécuter") print(paste("argument_1:", argument_1)) print(paste("argument_2: ", argument_2)) } # Ici, on utilise la fonction, avec deux paires d'arguments différentes nom_de_la_fonction("a", "b") nom_de_la_fonction("paf", "vroum") # Exemple de fonction produisant une valeur de retour my_square <- function(num) { return(num * num) } my_square(3) n <- my_square(2) n # Simulation de données: exemple avec boucles imbriquées ######################################################### generate_plate_results <- function(filename) { # Simuler des données pour des plaques 96 puits. # On veut de la place pour 3 exemplaires d'un même échantillon dans la plaque sample_names <- paste0("s", 1:(96%/%3)) sample_names_tripled <- rep(sample_names, each = 3) # On tire au sort l'ordre des échantillons dans la plaque sample_names_randomized <- sample( x = sample_names_tripled, size = length(sample_names_tripled), replace = FALSE) plate_rows <- LETTERS[1:8] plate_cols <- 1:12 measures <- rpois(96, lambda = 3) lines <- paste("row", "column", "sample", "value", sep = "\t") # Nombre de puits "remplis" i <- 1 for (r in plate_rows) { for (c in plate_cols) { lines <- c( lines, paste( r, c, sample_names_randomized[i], as.character(measures[i]), sep = "\t")) i <- i + 1 } } cat( paste(lines, collapse = "\n"), file = paste("test_results", filename, sep = "/")) } for (filename in paste0("run_", 1:3, ".tsv")) { generate_plate_results(filename) } # Équivalent à: #generate_plate_results("run_1.tsv") #generate_plate_results("run_2.tsv") #generate_plate_results("run_3.tsv")