Boucle et création d'une nouvelle colonne

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Anne-Laure Guinet
Messages : 15
Enregistré le : 10 Mai 2016, 13:17

Boucle et création d'une nouvelle colonne

Messagepar Anne-Laure Guinet » 10 Avr 2018, 15:23

Bonjour,

J'ai un data frame qui se présente ainsi :
GoldPre correspond au score de Goldberg en pré opératoire
GoldPost correspond au score de Goldberg en post opératoire

Code : Tout sélectionner

    RFT GoldPre    GoldPost 
  <dbl> <chr>      <chr>     
1  0    Non Stiff  Non Stiff
2  1.00 Stiff      borderline
3  0    Stiff      Non Stiff
4  1.00 Stiff      Stiff     
5  0    Stiff      Non Stiff
6  1.00 borderline Non Stiff


Je voudrais créer une nouvelle colonne en fonction de certaines conditions :
Condition 1 : si GoldPre = Non Stiff et GoldPost = Non Stiff alors dans ma troisième colonne devra être indiqué ECHEC
Condition 2 : si GoldPre = Stiff et GoldPost = Non Stiff alors dans ma troisième colonne devra être indiqué SUCCES
Condition 3 : si GoldPre = Stiff et GoldPost = Borderline alors dans ma troisième colonne devra être indiqué SUCCES

Quelqu'un a t-il une idée ?
J'imagine qu'il faut utiliser des boucles ...

Merci de votre aide précieuse,

Anne-Laure Guinet

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Boucle et création d'une nouvelle colonne

Messagepar Gabriel Terraz » 10 Avr 2018, 16:20

Salut,
Tu peux faire quelque chose comme ça :

D'abord tu crées une colonne vide que tu initialises avec la valeur de ton choix (j'ai pris "Succes" car cela permet de faire une seule manip pour transformer en échec certaines valeur), puis tu changes les valeurs qui valident la condition voulue :

Code : Tout sélectionner

df <- structure(list(RFT = c(0, 1, 0, 1, 0, 1), GoldPre = structure(c(2L,
3L, 3L, 3L, 3L, 1L), .Label = c("borderline", "Non_Stiff", "Stiff"
), class = "factor"), GoldPost = structure(c(2L, 1L, 2L, 3L,
2L, 2L), .Label = c("borderline", "Non_Stiff", "Stiff"), class = "factor"),
    new = c("Echec", "Succes", "Succes", "Succes", "Succes",
    "Succes")), .Names = c("RFT", "GoldPre", "GoldPost", "new"
), row.names = c(NA, -6L), class = "data.frame")


Code : Tout sélectionner

## Tu crées la colonne
df$new <- "Succes"
## Tu crées un vecteur booléen avec la condition voulue
cond <- df$GoldPre == "Non_Stiff" & df$GoldPost == "Non_Stiff"
## Tu changes les valeurs validant la condition :
df$new[cond] <- "Echec"

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Boucle et création d'une nouvelle colonne

Messagepar Logez Maxime » 11 Avr 2018, 07:36

Bonjour,

tu peux aussi passer par la création d'un facteur qui reprend les deux informations et associer à chaque niveau de ce facteur (levels) le résultat qui lui correspond :

Code : Tout sélectionner

# création du facteur
factor(do.call(paste, c(tab[2:3], sep="_")))
[1] Non Stiff_Non Stiff  Stiff_borderline     Stiff_Non Stiff     
[4] Stiff_Stiff          Stiff_Non Stiff      borderline_Non Stiff
5 Levels: borderline_Non Stiff Non Stiff_Non Stiff ... Stiff_Stiff

# niveau du facteur :
levels(factor(do.call(paste, c(tab[2:3], sep="_"))))
[1] "borderline_Non Stiff" "Non Stiff_Non Stiff"  "Stiff_borderline"   
[4] "Stiff_Non Stiff"      "Stiff_Stiff"

# association entre les niveaux et le résultat, bordeline & non stiff --> NA, Non stiff & non stiff --> ECHEC,
# sitff & bordeline --> SUCCES, etc.
c("NA", "ECHEC", "SUCCES", "SUCCES", "NA")[factor(do.call(paste, c(tab[2:3], sep="_")))]
[1] "ECHEC"  "SUCCES" "SUCCES" "NA"     "SUCCES" "NA"
Cordialement,
Maxime

Anne-Laure Guinet
Messages : 15
Enregistré le : 10 Mai 2016, 13:17

Re: Boucle et création d'une nouvelle colonne

Messagepar Anne-Laure Guinet » 11 Avr 2018, 14:05

Super !

Merci à vous deux pour vos réponses, mon problème est résolu !

Anne-Laure


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité