1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2017
    Messages : 10
    Points : 6
    Points
    6

    Par défaut Problème dans le tri d'une table avec la fonction order()

    Bonsoir,

    J'utilise R Studio.

    Mon but est de créer un data.frame issu du tri d'une table en fonction de plusieurs variables.

    Les variables que je souhaite trier se nomment pop, pophom, popfem.
    Je code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_triee2<-ra2010lib[order(ra2010lib$pop,ra2010lib$pophom,ra2010lib$popfem,decreasing = TRUE)]
    Or une erreur s'affiche systématiquement dans ma log :

    Error in `[.data.frame`(ra2010lib, order(ra2010lib$pop, ra2010lib$pophom, :
    undefined columns selected


    Je ne comprends pas pourquoi les colonnes sélectionnées ne sont pas définies ... ?
    Je ne vois pas d'erreur de syntaxe, donc je ne comprends pas bien.
    À moins que ce ne soit une incompatibilité entre les variables ? C'est-à-dire que si les trois variables ne suivent pas le même trend, on ne peut pas trier la table ? - ce qui dans un sens ne serait pas illogique ? -

    Autre question : le point rouge devant cette ligne de mon script signifie bien qu'il y a une erreur dans le code ?

    Merci pour l'aide !

  2. #2
    Membre actif
    Inscrit en
    février 2011
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 135
    Points : 277
    Points
    277

    Par défaut

    Bonjour,

    comme tu tries des lignes il faut le spécifier dans ta commande [order(...),] ne pas oublier la virgule après la fonction order. Sinon une autre programmation qui peut-être utile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table_triee2<-ra2010lib[order(ra2010lib$pop,ra2010lib$pophom,ra2010lib$popfem,decreasing = TRUE),]
    ra2010lib[do.call(order, c(ra2010lib[c("popo", "pophom", "popfem")], decreasing = TRUE)),]
    cdlt

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2017
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Bonjour,

    Merci pour la réponse.
    En effet, cela fonctionne lorsque je mets cette virgule après order. Et donc j'imagine que si je voulais trier les colonnes, sur le même principe, j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_triee2<-ra2010lib[,order(ra2010lib$pop,ra2010lib$pophom,ra2010lib$popfem,decreasing = TRUE)]
    La virgule veut en fait faire comprendre à R ce qu'on trie (lignes ou colonnes), est-ce bien cela?

    Mais dans le cas où je ne trie qu'une ligne, pourquoi la ligne de code suivante fonctionne et n'ai je pas besoin de spécifier ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_triee<-ra2010lib$pop[order(ra2010lib$pop,decreasing=TRUE)]
    Merci

  4. #4
    Membre actif
    Inscrit en
    février 2011
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 135
    Points : 277
    Points
    277

    Par défaut

    Bonjour,

    C'est un peu plus compliqué que ça mais c'est expliqué dans tous les guides de démarrage de R.
    Une matrice à deux dimensions, les lignes et les colonnes. Pour extraire des données de cette matrice on utilise la syntaxe : matrice[ , ]. Les crochets permettent d'extraire des informations de la matrice. La virgule permet de séparer les deux dimensions de la matrice, d'abord les lignes puis les colonnes : matrice[ici les lignes , ici les colonnes]. Si tu laisses vide l'espace avant la virgule ça veut dire que tu prends en compte toutes les lignes. Si tu laisses vide l'espace après la virgule alors c'est que tu prends en compte toutes les colonnes.
    Prends cette matrice pour exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mat <- matrix(1:6, 3, 2)
         [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
    Si tu veux les valeurs sur la première ligne de mat : mat[1, ]. Ici le 1 dans les crochets est placé avant la virgule pour spécifier qu'il s'agit de la première ligne et on laisse blanc après la virgule pour spécifier que l'on veut toutes les colonnes. On obtient bien les valeurs 1 et 4 qui sont les valeurs de la première ligne et de toutes les colonnes.

    Quand tu fais mat[c(2,1,3), ], tu tries les valeurs selon les lignes mais les colonnes ne sont pas impactées en ce sens que l'ordre des valeurs selon les colonnes n'est pas modifié. le 1 est toujours dans la première colonne et le 4 est toujours dans la deuxième colonne.

    Quand tu tries les valeurs il te faut t'assurer que le vecteur que tu te sers dans le tri à la même longueur que la dimension selon laquelle tu tries. Dans mon exemple c(2, 1, 3) est un vecteur de 3 valeurs et il y a bien 3 lignes. Si j'avais mis ce vecteur au niveau des colonnes il y aurait eu un souci, parce que mon vecteur de 3 valeurs est plus grand que le nombre de colonnes (2).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ra2010lib$pop[order(ra2010lib$pop,decreasing=TRUE)]
    Cette ligne fonctionne parce que quand tu fais ra2010lib$pop tu ne travailles plus sur une matrice ou un data.frame, tu ne travailles plus sur un objet à 2 dimensions, mais sur un vecteur qui lui n'a qu'une dimension et donc tu n'as pas besoin de spécifier de virgule pour identifier les lignes ou les colonnes parce qu'il n'en a pas.

    cdlt

Discussions similaires

  1. Problème dans la recherche d'une Table existante
    Par topanonga dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/09/2017, 15h30
  2. problème dans le parcours d'une table (avec un code VBA)
    Par Hania06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/04/2017, 13h08
  3. Problème dans la création d'une table
    Par HAM_10 dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 09/02/2017, 23h48
  4. Réponses: 3
    Dernier message: 01/03/2016, 14h53
  5. Réponses: 5
    Dernier message: 10/12/2012, 12h20

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