Ifelse ou Boucle

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

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Ifelse ou Boucle

Messagepar Anais Payen » 19 Avr 2019, 10:10

Bonjour à tous,

Je rencontre un petit problème car je suis clairement réfractaire à l'utilisation de boucles dans R (due à mon manque de compétence^^)

Je souhaiterai remplir une nouvelle colonne en fonction de la présence de 2 autres, voici mon df :

Code : Tout sélectionner

      cip7 code_atc.x code_atc.y
1  2160050    R03DC03    R03DC03
2  2160191    <NA>       R03DC03
3  2160417    J05AB04    J05AB04
4  2160423    J05AB04    J05AB04
5  2160469    S01BC11    S01BC11
6  2160475    A02BC05       <NA>
7  2160481    A02BC05       <NA>
8  2160506    A02BC05       <NA>
9  2160587    A02BC05       <NA>
10 2160601    A02BC05       <NA>
11 2160707    J01FA09    J01FA09
12 2160759    <NA>       J01FA09
13 2160765    J01FA09    J01FA09
14 2160788    A02BC05       <NA>
15 2160794    A02BC05       <NA>
16 2160819    A02BC05    A02BC05
17 2160908    L03AB07    L03AB07
18 2160937    <NA>       A02BC05
19 2160966    A02BC05    A02BC05
20 2161055    <NA>       G01AA51


Donc je souhaiterai avoir une colonne code_atc.z , qui soit rempli par x quand celui ci est plein, et lorsque x est vide par y.
J'avais pensé à ifelse :

Code : Tout sélectionner

df$code_atc.z <- (df,df$code_atc.x, df$code.atc.y)

Mais je sais qu'il me manque quelque chose ...

Quelqu'un aurait il une piste?

Merci d'avance :)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Ifelse ou Boucle

Messagepar Mickael Canouil » 19 Avr 2019, 10:31

Bonjour,

il manque tout le simplement le "ifelse()" ( version vectorielle de "if() else") et la condition.

Code : Tout sélectionner

.data <- read.table(
  stringsAsFactors = FALSE,
  header = TRUE,
  na.strings = "<NA>",
  text = "      cip7 code_atc.x code_atc.y
  1  2160050    R03DC03    R03DC03
  2  2160191    <NA>       R03DC03
  3  2160417    J05AB04    J05AB04
  4  2160423    J05AB04    J05AB04
  5  2160469    S01BC11    S01BC11
  6  2160475    A02BC05       <NA>
  7  2160481    A02BC05       <NA>
  8  2160506    A02BC05       <NA>
  9  2160587    A02BC05       <NA>
  10 2160601    A02BC05       <NA>
  11 2160707    J01FA09    J01FA09
  12 2160759    <NA>       J01FA09
  13 2160765    J01FA09    J01FA09
  14 2160788    A02BC05       <NA>
  15 2160794    A02BC05       <NA>
  16 2160819    A02BC05    A02BC05
  17 2160908    L03AB07    L03AB07
  18 2160937    <NA>       A02BC05
  19 2160966    A02BC05    A02BC05
  20 2161055    <NA>       G01AA51"
)


Code : Tout sélectionner

.data[["code_atc.z"]] <- ifelse(
  test = is.na(.data[["code_atc.x"]]),
  yes = .data[["code_atc.y"]],
  no = .data[["code_atc.x"]]
)

Code : Tout sélectionner

.data
#>       cip7 code_atc.x code_atc.y code_atc.z
#> 1  2160050    R03DC03    R03DC03    R03DC03
#> 2  2160191       <NA>    R03DC03    R03DC03
#> 3  2160417    J05AB04    J05AB04    J05AB04
#> 4  2160423    J05AB04    J05AB04    J05AB04
#> 5  2160469    S01BC11    S01BC11    S01BC11
#> 6  2160475    A02BC05       <NA>    A02BC05
#> 7  2160481    A02BC05       <NA>    A02BC05
#> 8  2160506    A02BC05       <NA>    A02BC05
#> 9  2160587    A02BC05       <NA>    A02BC05
#> 10 2160601    A02BC05       <NA>    A02BC05
#> 11 2160707    J01FA09    J01FA09    J01FA09
#> 12 2160759       <NA>    J01FA09    J01FA09
#> 13 2160765    J01FA09    J01FA09    J01FA09
#> 14 2160788    A02BC05       <NA>    A02BC05
#> 15 2160794    A02BC05       <NA>    A02BC05
#> 16 2160819    A02BC05    A02BC05    A02BC05
#> 17 2160908    L03AB07    L03AB07    L03AB07
#> 18 2160937       <NA>    A02BC05    A02BC05
#> 19 2160966    A02BC05    A02BC05    A02BC05
#> 20 2161055       <NA>    G01AA51    G01AA51


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 19 Avr 2019, 10:38

Mickael Canouil a écrit :Bonjour,

il manque tout le simplement le "ifelse()" ( version vectorielle de "if() else") et la condition.



Oui désolée ^^ il est écrit dans mon script et j'ai mal recopié!
Cela fonctionne à merveille, je vous remercie!

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 19 Avr 2019, 12:40

Mickael Canouil a écrit :

Code : Tout sélectionner

.data[["code_atc.z"]] <- ifelse(
  test = is.na(.data[["code_atc.x"]]),
  yes = .data[["code_atc.y"]],
  no = .data[["code_atc.x"]]
)



Petite question, est ce que les doubles crochets correspondent à $ ou c'est différent? Sous entendu data$code_atc.x serait la même chose que data[["code_atc.x"]].

Merci d'avance!

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Ifelse ou Boucle

Messagepar Pierre-Yves Berrard » 19 Avr 2019, 12:44

Oui c'est (quasiment) équivalent.

$ permet de ne mettre que le début du nom de la variable (déconseillé)
[[ peut servir dans ce contexte :

Code : Tout sélectionner

ma_variable <- "code_atc.z"
.data[[ma_variable]]
# .data$ma_variable ne fonctionne pas
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Ifelse ou Boucle

Messagepar Mickael Canouil » 19 Avr 2019, 13:08

L'un des intérêts (pour moi) du [[ est de pouvoir bénéficier de la coloration syntaxique (dans un éditeur de code) du nom de la variable (chaîne de caractère), ce qui n'est pas possible (dans presque tous les langages) avec le $
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: Ifelse ou Boucle

Messagepar Logez Maxime » 19 Avr 2019, 13:46

Bonjour,

Dans un cas comme celui-ci le ifelse n'est pas nécessaire tu peux faire :

Code : Tout sélectionner

tab$code_atc.z <- tab$code_atc.x
auxi <- is.na(tab$tab$code_atc.x)
tab$code_atc.z[auxi] <- tab$code_atc.y[auxi]
Cordialement,
Maxime

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 19 Avr 2019, 14:19

Pierre-Yves Berrard a écrit :Oui c'est (quasiment) équivalent.

$ permet de ne mettre que le début du nom de la variable (déconseillé)
[[ peut servir dans ce contexte :

Code : Tout sélectionner

ma_variable <- "code_atc.z"
.data[[ma_variable]]
# .data$ma_variable ne fonctionne pas

Je ne suis pas sure d'avoir saisi le sens de votre explication, vous dites que $ permet de ne mettre que le début de la variable? pourtant les miennes sont toujours écrites en entier.
Et pourquoi le data$ma_variable ne fonctionne pas?
Le point devant data a-t-il une importance?

Je sais que vous avez raison, je n'arrive juste pas à comprendre pourquoi ^^


Mickael Canouil a écrit :L'un des intérêts (pour moi) du [[ est de pouvoir bénéficier de la coloration syntaxique (dans un éditeur de code) du nom de la variable (chaîne de caractère), ce qui n'est pas possible (dans presque tous les langages) avec le $

Donc il s'agit plutôt de visuel?
Pour moi, en terme de rapidité, les doubles [[ c'est un peu l'horreur ^^ (pas pratique à faire sur le clavier)


Logez Maxime a écrit :Bonjour,

Dans un cas comme celui-ci le ifelse n'est pas nécessaire tu peux faire :

Code : Tout sélectionner

tab$code_atc.z <- tab$code_atc.x
auxi <- is.na(tab$tab$code_atc.x)
tab$code_atc.z[auxi] <- tab$code_atc.y[auxi]
Cordialement,
Maxime

Je prends note pour un prochain essai, j'ai de grosses difficultés à coder avec les []!


En tout cas, merci à tous pour votre temps, vos réponses!

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Ifelse ou Boucle

Messagepar Pierre-Yves Berrard » 19 Avr 2019, 15:26

Anais Payen a écrit :
Pierre-Yves Berrard a écrit :Oui c'est (quasiment) équivalent.

$ permet de ne mettre que le début du nom de la variable (déconseillé)
[[ peut servir dans ce contexte :

Code : Tout sélectionner

ma_variable <- "code_atc.z"
.data[[ma_variable]]
# .data$ma_variable ne fonctionne pas

Je ne suis pas sure d'avoir saisi le sens de votre explication, vous dites que $ permet de ne mettre que le début de la variable? pourtant les miennes sont toujours écrites en entier.
Et pourquoi le data$ma_variable ne fonctionne pas?


Par "permet", j'entendais "offre la possibilité" (et par "déconseillé" j'entendais "ne pas le faire").

Quelques exemples illustrant les possiblités des deux syntaxes :

Code : Tout sélectionner

df <- data.frame(revenu = 1:3, var10 = 4:6, var20 = 7:9)

df$revenu
#> [1] 1 2 3
df$rev
#> [1] 1 2 3

df[["revenu"]]
#> [1] 1 2 3
df[["rev"]]
#> NULL

df$var1
#> [1] 4 5 6
df$var
#> NULL

ma_variable <- "revenu"
df[[ma_variable]]
#> [1] 1 2 3
df$ma_variable
#> NULL


Anais Payen a écrit :Le point devant data a-t-il une importance?

Aucune. C'était comme ça dans l'exemple de Mickaël.
PY

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 19 Avr 2019, 15:36

Je découvre des choses que je n'avais jamais essayé! Mais vous dites qu'il ne faut pas le faire, alors merci :)

Pierre-Yves Berrard a écrit :[

Code : Tout sélectionner

ma_variable <- "revenu"
df[[ma_variable]]
#> [1] 1 2 3
df$ma_variable
#> NULL



Je trouve cela "marrant" que ça ne fonctionne pas dans les 2 sens, que passer par $ ou [[]] fonctionne, mais pas l'inverse!
Merci pour vos explications !

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 23 Avr 2019, 13:31

Logez Maxime a écrit :Bonjour,

Dans un cas comme celui-ci le ifelse n'est pas nécessaire tu peux faire :

Code : Tout sélectionner

tab$code_atc.z <- tab$code_atc.x
auxi <- is.na(tab$tab$code_atc.x)
tab$code_atc.z[auxi] <- tab$code_atc.y[auxi]
Cordialement,
Maxime



Bonjour,

Je viens d'essayer sur un autre df, et cela ne fonctionne pas, je crois qu'il me remplit les colonnes avec l'indexation des vrai/faux.

En fait, j'ai même essayé avec l'autre formule, et il me remplit ma colonne de chiffre... La raison? C'est un mystère pour moi..

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Ifelse ou Boucle

Messagepar Pierre-Yves Berrard » 24 Avr 2019, 07:55

L'explication est soit dans votre nouveau df, soit dans les instructions que vous avez utilisées. Comme vous ne donnez ni l'un ni l'autre, le mystère ne risque pas d'être levé.
Il y a aussi une petite coquille dans le code de Maxime (tab$tab$...)

Sinon, la fonction coalesce du package dplyr est bien pratique quand il s'agit de remplir des valeurs manquantes.
PY

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Ifelse ou Boucle

Messagepar Anais Payen » 24 Avr 2019, 09:53

Pierre-Yves Berrard a écrit :L'explication est soit dans votre nouveau df, soit dans les instructions que vous avez utilisées. Comme vous ne donnez ni l'un ni l'autre, le mystère ne risque pas d'être levé.
Il y a aussi une petite coquille dans le code de Maxime (tab$tab$...)

Sinon, la fonction coalesce du package dplyr est bien pratique quand il s'agit de remplir des valeurs manquantes.



J'espérais pouvoir mettre un exemple ce matin, mais le problème s'est résolu de lui même..!

Pour le code de Maxime, j'avais effectivement envisagé qu'il y avait une erreur de frappe!

Merci pour la fonction je vais y regarder! :)


Retourner vers « Questions en cours »

Qui est en ligne

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