IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Fonction ifelse "imbriqué"


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut Fonction ifelse "imbriqué"
    Bonjour, je rencontre un problème avec une fonction qui fait appel à plusieurs conditions.

    Mon tableau de données se présente sous la forme :
    L1 L2 L3
    X1 3 6 4
    X2 1 5 9
    X3 2 4 6
    X4 1 2 9

    où x correspond à des individus et L a différentes observations.
    J'aimerais obtenir un tableau de la forme :

    L1 L2 L3 type
    X1 3 6 4 P
    X2 1 5 9 F
    X3 2 4 6 P
    X4 1 2 9 P

    où le "type" a indiqué dépend des différentes observations. La fonction m'indiquera P lorsque dans l'une des 3 colonnes , x est égal à 2 et/ou 5 et/ou à 7. Sinon la fonction indiquera F si x est égal à 1 et/ou 3 et/ou 9, sinon elle indiquera IND. L'ordre de priorité est P et ensuite F, ie si pour x un seul code appartient à c(2,5,7) alors le type sera P malgré la présence de code faisant appel à F.

    Voici le script auquel je pensais (mais qui ne marche pas) pour lequel j'aurais besoin de votre aide. Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type<-function(L1 , L2 , L3){
    		ifelse( L1 | L2 | L3 %in% c(2,5,7),"P",
    		ifelse( L1 | L2 | L3 %in% c(1,3,9),"F", "IND"))
    				}
    table$type<-type (L1,L2,L3)

  2. #2
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Bonjour,
    voici une proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    d <- matrix(c(3,1,2,1,6,5,4,2,4,9,6,9), nrow=4, dimnames=list(c("X1","X2","X3","X4"),c("L1","L2","L3")))
    type<-function(L1 , L2 , L3){ ifelse( L1 | L2 | L3 %in% c(2,5,7),"P",
    ifelse( L1 | L2 | L3 %in% c(1,3,9),"F", "IND")) }
    d <- cbind(d,type (d[,"L1"],d[,"L2"],d[,"L3"]))
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > d
       L1  L2  L3     
    X1 "3" "6" "4" "P"
    X2 "1" "5" "9" "P"
    X3 "2" "4" "6" "P"
    X4 "1" "2" "9" "P"
    Est-ce que c'est ce que vous vouliez?
    Bonne continuation

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    Merci d'avoir répondu si rapidement. Cependant j'étais déjà arrivée à ce type de résultat avec un transform. Le problème est que si l'on modifie l'exemple de matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    d <- matrix(c(1,1,1,1,1,1,1,1,1,1,1,1), nrow=4, dimnames=list(c("X1","X2","X3","X4"),c("L1","L2","L3")))
    type<-function(L1 , L2 , L3){ ifelse( L1 | L2 | L3 %in% c(2,5,7),"P",
    + ifelse( L1 | L2 | L3 %in% c(1,3,9),"F", "IND")) }
    d <- cbind(d,type (d[,"L1"],d[,"L2"],d[,"L3"]))



    d me sort "P" de la même manière, mon exemple n'était pas fracassant car il ne faisait apparaitre que le résultat d'une condition.

  4. #4
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Bonjour,
    désolée pour hier, j'étais totalement à côté de la plaque

    Voici une nouvelle proposition (je n'ai testé que sur les 2 exemples, donc je me méfie de mes étourderies...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    d <- matrix(c(3,1,2,1,6,5,4,2,4,9,6,9),   nrow=4, dimnames=list(c("X1","X2","X3","X4"),c("L1","L2","L3")))
     
    typ <-function(X){ ifelse( sum(X %in% c(2,5,7))!=0,"P",
                              ifelse(sum(X %in% c(1,3,9))!=0,"F","IND"))}
     
    y <- c(typ(d["X1", ]), typ(d["X2", ]), typ(d["X3", ]), typ(d["X4", ]))
     
    cbind(d,y)
    (la première ligne doit bien donner "F" non?)

    C'est mieux?

    Bon courage

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    Bonjour,

    Merci beaucoup, le script fonctionne sans problèmes.
    Je me permet de vous reposer une question. Mon tableau contient en réalité 500 lignes pour 6 colonnes. Comment puis je l'appliquer sans citer les lignes une à une. Il doit surement y avoir la solution boucle, mais étant novice, je n'arrive pas à ma dépatouiller avec. Auriez-vous des pistes à m'indiquer ?

    J'ai tenté en faisant comme cela, sans grand succès, j'imagine que la boucle ne prend en compte que la première colonne, de plus elle me sort pas mal de NA qui devrait normalement être d'autres résultats de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i in length(d[,1])) y[i] <- typ(d[i,])
    Encore merci.

  6. #6
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut
    Bonjour,
    c'est normal d'essayer de s'entraider...moi aussi je débute!

    Ce qui pose problème est le nombre de lignes, donc pourquoi pas quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y <- sapply(1:500, function(i){typ(d[i,])})
    J'espère que cela fonctionnera!
    Bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo