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 :

Selection ligne data.frame


Sujet :

R

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Selection ligne data.frame
    Bonjour à tous,

    J'ai un data.frame ( que j'appel essai ) de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                 ratio_1dpe ratio_1dpe.1  ratio_2dpe ratio_2dpe.1 ratio_4dpe ratio_4dpe.1  ratio_7dpe ratio_7dpe.1
    A_52_P616356 -2.8524861    0.8921355  0.01995202 -0.372966285 -0.3493990  -0.14714019 -0.63053582 -0.038961386
    A_52_P580582 -0.6421028   -0.5970537  0.37516182  3.581678510 -2.7336489  -2.75909738 -3.94470256 -3.197878500
    A_52_P403405  0.1499361    0.1173973  0.18468079 -0.131158345 -0.5415471  -0.02313133 -0.01896383  0.093523755
    les 2 colonnes ratio_1dpe sont liées, ratio_2dpe egalement et idem pour les autres. Ce sont en quelque sorte des "conditions" . Je souhaiterai en fait selectionner les lignes pour lesquelles la valeur que prend abs(ratio_1dpe) ou abs(ratio_2dpe) etc soit >2 dans au moins une condition. J'ai donc fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sel.essai <- essai[apply(essai[,c(grep("ratio",colnames(essai)))],1,function(x){any(abs(x)>2)}),]
    Cela fonctionne.

    Mais, j'aimerai en fait, que pour une meme ligne, les deux valeurs de abs(ratio_1dpe) ou abs(ratio_2dpe) etc soit >2 ... comment puis je faire ? Est ce possible de la faire simplement ?

    Merci d'avance pour l'attention que vous porterez à mes questions.

    Isa

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Citation Envoyé par Isabella83 Voir le message
    Je souhaiterai en fait selectionner les lignes pour lesquelles la valeur que prend abs(ratio_1dpe) ou abs(ratio_2dpe) etc soit >2 dans au moins une condition.

    (...)

    Mais, j'aimerai en fait, que pour une meme ligne, les deux valeurs de abs(ratio_1dpe) ou abs(ratio_2dpe) etc soit >2 ...
    Votre problème n'est pas très clair. En effet, si votre objectif est la création de conditions logiques avec R, attention à ne pas vous mélanger les pinceaux dans les termes utilisés ("et" et "ou" ne sont pas la même chose !!!).

    En effet, en faisant tourner la ligne de code que vous nous fournissez, on obtient en sortie toutes les lignes pour lesquelles au moins une des valeurs est supérieure à 2 en valeur absolue.
    Or si j'ai bien compris, votre objectif est finalement de sélectionner uniquement les lignes pour lesquelles TOUTES les valeurs sont supérieures à 2 (en valeur absolue), c'est bien cela?


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour A.D,

    Désolée si je n'ai pas été très claire.

    C'est bien cela, la ligne de code que j'ai écrite permet de sélectionner les lignes où au moins une des valeur est >2 en valeur absolue.
    Or, j'aimerai sélectionner les lignes pour lesquelles les valeurs absolue de ratio_1dpe>2 et ratio_1dpe > 2 et/ou ratio_2dpe>2 et ratio_2dpe >2 et/ou ratio_4dpe>2 et ratio_4dpe >2 et/ou ratio_7dpe>2 et ratio_7dpe >2

  4. #4
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour,

    L'explication n'est effectivement pas très claire, et c'est toujours mieux de poster un exemple qu'on puisse faire tourner directement.
    Je crois cependant avoir compris quel est le problème...

    Il faut procéder en deux étape, avec all() pour tes conditions "et" et any() pour tes conditions "ou" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    df <- as.data.frame(matrix(rnorm(32, 0, 2),
                               ncol=8,
                               dimnames=list(NULL,
                                             paste("ratio_", rep(1:4, each=2),
                                                   "dpe", c("", ".1"), sep=""))))
    
    idx <- apply(sapply(unique(sub(".1$", "", colnames(df))),
                        function(gp)               # Pour chaque groupe ("ratio_1dpe", "ratio_2dpe", etc.)
                    {
                        apply(df[ , grep(gp, colnames(df))],
                              1,
                              function(x){all(abs(x)>2)}) # Toutes les valeurs abs > 2 pour le groupe ?
                    }),
                 1,
                 any)                              # lignes pour lesquelles la condition est vrai pour au moins un groupe.
    
    
    df[idx, ]
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    pitipoisson,

    Merci pour votre réponse qui m'aide beaucoup, c'est tout à fait ce que je cherchais à faire.

    Cependant, il me reste encore un petit problème. Je cherche également à supprimer les cas pour lesquels pour une meme condition, j'ai une valeur positive et une valeur négative.
    J'ai donc rajouté la condition (en gras ci dessous) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    idx <- apply(sapply(unique(sub(".1$", "", colnames(essai))),
                        function(gp)               # Pour chaque groupe ("ratio_1dpe", "ratio_2dpe", etc.)
                     {
                         apply(df[ , grep(gp, colnames(essai))],
                               1,
                               function(x){all(abs(x)>2) && (all(x>0) || all(x<0))}) # Toutes les valeurs abs > 2.
                     }),
                  1,
                 any)
    Mais cela ne fonctionne pas et je ne comprends pas d'où provient mon erreur.

    Merci d'avance,

    Isa

  6. #6
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Ça fonctionne pourtant très bien chez moi (exécute uniquement le sapply, c'est plus parlant).

    Si c'est un problème particulier, il faut que tu nous le décrives plus précisément pour qu'on puisse t'aider.

    Ceci dit, tu peux également utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
       function(x){all(abs(x)>2) && prod(x) > 0}
    ...
    (plus condensé mais peut-être un peu moins lisible.)
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Au temps pour moi, j'avais fait une erreur dans le code !
    Merci pour tout

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

Discussions similaires

  1. mean() sur ligne data.frame : problème des levels
    Par AustinPower999 dans le forum R
    Réponses: 0
    Dernier message: 01/04/2013, 22h11
  2. Réponses: 3
    Dernier message: 11/03/2013, 08h52
  3. Tri d'un data.frame par numéro de ligne
    Par MMDM12 dans le forum R
    Réponses: 3
    Dernier message: 23/05/2012, 10h37
  4. Selection ligne objet data.frame
    Par Isabella83 dans le forum R
    Réponses: 2
    Dernier message: 12/07/2011, 09h49
  5. Dupliquer les lignes d'une data. frame
    Par manoir dans le forum R
    Réponses: 2
    Dernier message: 09/07/2009, 18h25

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