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 objet 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 objet data.frame
    Bonjour à tous,

    J'ai un data.frame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > test
           1dpe      1dpe      2dpe      2dpe
    a 18.602971  3.630571  3.410561  4.352493
    b 14.602971 14.925448  3.410561  3.591148
    c  4.352493  4.326872 12.844528 12.658118
    d  3.564454 14.925448 14.602971  3.591148
    e  3.564454  3.630571 13.190097 12.499158
    Et je souhaiterais sélectionner les lignes pour lesquelles la valeur absolue de la moyenne des valeurs 1dpe - moyenne valeurs 2dpe > 2 ET la variance 1dpe < à la variance des moyennes (var(c(mean(1dpe),mean(2dpe)) ET la variance 2dpe < à la variance des moyennes

    pour cela, j'ai écrit cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idx_1vs2 <- test[
      abs((apply(test[,c(grep("1dpe",colnames(test)))],1,mean) - apply(test[,c(grep("2dpe",colnames(test)))],1,mean)))>2
      &&
      2*apply(test[,c(grep("1dpe",colnames(test)))],1,var)- apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var)<0
      &&
      (2*apply(test[,c(grep("2dpe",colnames(test)))],1,var)-apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var))<0 
      ,]
    mais lorsque je fais :

    objet <- test[idx_1vs2 ,] je n'ai aucune ligne, alors que je devrais avoir les lignes 2,3,5 qui "remplissent" les trois conditions .

    Quelqu'un pourrait me dire ce qui ne va pas ?

    Merci d'avance,

    Isa

  2. #2
    Membre averti
    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
    Points : 417
    Points
    417
    Par défaut Avec subset
    Citation Envoyé par Isabella83 Voir le message
    Bonjour à tous,

    J'ai un data.frame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > test
           1dpe      1dpe      2dpe      2dpe
    a 18.602971  3.630571  3.410561  4.352493
    b 14.602971 14.925448  3.410561  3.591148
    c  4.352493  4.326872 12.844528 12.658118
    d  3.564454 14.925448 14.602971  3.591148
    e  3.564454  3.630571 13.190097 12.499158
    Et je souhaiterais sélectionner les lignes pour lesquelles la valeur absolue de la moyenne des valeurs 1dpe - moyenne valeurs 2dpe > 2 ET la variance 1dpe < à la variance des moyennes (var(c(mean(1dpe),mean(2dpe)) ET la variance 2dpe < à la variance des moyennes

    pour cela, j'ai écrit cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idx_1vs2 <- test[
      abs((apply(test[,c(grep("1dpe",colnames(test)))],1,mean) - apply(test[,c(grep("2dpe",colnames(test)))],1,mean)))>2
      &&
      2*apply(test[,c(grep("1dpe",colnames(test)))],1,var)- apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var)<0
      &&
      (2*apply(test[,c(grep("2dpe",colnames(test)))],1,var)-apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var))<0 
      ,]
    mais lorsque je fais :

    objet <- test[idx_1vs2 ,] je n'ai aucune ligne, alors que je devrais avoir les lignes 2,3,5 qui "remplissent" les trois conditions .

    Quelqu'un pourrait me dire ce qui ne va pas ?

    Merci d'avance,

    Isa
    Bonjour,
    je n'ai pas repris votre code.
    Personnellement, j'utilise Ce qui donnerait pour vous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyTest <- subset(test, abs((apply(test[,c(grep("1dpe",colnames(test)))],1,mean) - apply(test[,c(grep("2dpe",colnames(test)))],1,mean)))>2
      &
      2*apply(test[,c(grep("1dpe",colnames(test)))],1,var)- apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var)<0
      &
      (2*apply(test[,c(grep("2dpe",colnames(test)))],1,var)-apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var))<0)
    Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyTest 
           1dpe    1dpe.1      2dpe    2dpe.1
    b 14.602971 14.925448  3.410561  3.591148
    c  4.352493  4.326872 12.844528 12.658118
    e  3.564454  3.630571 13.190097 12.499158
    En espérant que cela puisse vous aider.

    Bonne journée

  3. #3
    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,

    Citation Envoyé par Isabella83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idx_1vs2 <- test[
      abs((apply(test[,c(grep("1dpe",colnames(test)))],1,mean) - apply(test[,c(grep("2dpe",colnames(test)))],1,mean)))>2
      &&
      2*apply(test[,c(grep("1dpe",colnames(test)))],1,var)- apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var)<0
      &&
      (2*apply(test[,c(grep("2dpe",colnames(test)))],1,var)-apply(data.frame(apply(test[,c(grep("1dpe",colnames(test)))],1,mean),apply(test[,c(grep("2dpe",colnames(test)))],1,mean)),1,var))<0 
      ,]
    mais lorsque je fais :

    objet <- test[idx_1vs2 ,] je n'ai aucune ligne, alors que je devrais avoir les lignes 2,3,5 qui "remplissent" les trois conditions .

    Quelqu'un pourrait me dire ce qui ne va pas ?
    Pour moi, la première chose qui ne va pas, c'est l'utilisation du ET logique "doublé" (&&) qui ne fait la comparaison que sur le premier élément (idem pour ||) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > c(TRUE, TRUE) && c(FALSE, TRUE)
    [1] FALSE
    > c(TRUE, TRUE) & c(FALSE, TRUE)
    [1] FALSE  TRUE
    Ensuite, il me semble important d'aérer le code et de bien utiliser l'indentation pour faire ressortir les structures logiques (avec des arguments nommés et du commentaire, ce serait encore mieux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    idx_1vs2 <- test[abs((apply(test[, c(grep("1dpe", colnames(test)))], 1, mean) -
                          apply(test[, c(grep("2dpe", colnames(test)))], 1, mean))) > 2
                     &&
                     2 * apply(test[, c(grep("1dpe", colnames(test)))], 1, var) -
                     apply(data.frame(apply(test[, c(grep("1dpe", colnames(test)))], 1, mean),
                                      apply(test[, c(grep("2dpe", colnames(test)))], 1, mean)),
                           1, var) < 0
                     &&
                     (2 * apply(test[, c(grep("2dpe", colnames(test)))], 1, var) -
                      apply(data.frame(apply(test[, c(grep("1dpe", colnames(test)))], 1, mean),
                                       apply(test[, c(grep("2dpe", colnames(test)))], 1, mean)),
                            1, var)) < 0
                     , ]
    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


    )><))))°>

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 data.frame
    Par Isabella83 dans le forum R
    Réponses: 6
    Dernier message: 22/06/2011, 15h58
  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