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 :

Requête en ligne et en colonne


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut Requête en ligne et en colonne
    Bonjour à tous,

    Je suis à la recherche d'une méthode de requête qui consiste à faire une somme d'une partie d'un tableau en filtrant par ligne et par colonne, selon des identidiants.

    Je m'explique à l'aide d'un exemple. J'ai un tableau du même type que le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      1         2      3        4
    1 id     Paris   Paris   Reims
    2 Paris     1      10       2  
    3 Reims     2      20       7
    4 Macon     8       0      11
    5 Reims    10       1      14
    Je tente de faire la somme des cellules des couples Paris - Reims (quel que soit l'ordre). C'est-à-dire, je veux la somme suivante : somme des cellules dont l'entrée en ligne est Paris et l'entrée en colonne est Reims + les cellules dont l'entrée en ligne est Reims et l'entrée en colonne est Paris.

    Dans cet exemple, cela revient aux valeurs en gras et soulignées dans le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      1         2      3        4
    1 id     Paris   Paris   Reims
    2 Paris     1      10       2  
    3 Reims     2      20       7
    4 Macon     8       0      11
    5 Reims    10       1      14
    Je suppose que cela est assez classique mais je ne parviens pas à trouver d'information à ce sujet qui répond à ma requête.

    Merci à tous pour votre aide précieuse.

    G.

  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 : 37
    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
    Par défaut
    Bonjour,

    Il y a peut-être plus joli mais une idée est d'utiliser la fonction "which" ([codeinline]?which[codeinline]) et procéder en deux étapes : d'abord filtrer sur les lignes, puis sur ce nouveau tableau, filtrer sur les colonnes.

    Je vous laisse tester, n'hésitez pas à poster votre code si vous êtes bloqué


    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 averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonjour A.D.,

    Merci pour cette réponse.
    Je vais tester cela. Cependant, je pense que cela me sera utile, mais dans une moindre mesure.
    En effet, j'aimerais à terme faire des requêtes avec des ou.

    Par exemple, faire la somme des cellules pour les couples Paris - Reims ou Reims - Paris (j'ai modifié mon message initial pour plus de clarté).

    Bien cordialement,
    G.

  4. #4
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    une autre possibilité avec la librairie reshape 2 :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # mise en forme de la matrice de données
    tab <- structure(list(V2 = structure(c(1L, 3L, 4L, 2L, 4L), .Label = c("id", 
    "Macon", "Paris", "Reims"), class = "factor"), V3 = structure(c(5L, 
    1L, 3L, 4L, 2L), .Label = c("1", "10", "2", "8", "Paris"), class = "factor"), 
        V4 = structure(c(5L, 3L, 4L, 1L, 2L), .Label = c("0", "1", 
        "10", "20", "Paris"), class = "factor"), V5 = structure(c(5L, 
        3L, 4L, 1L, 2L), .Label = c("11", "14", "2", "7", "Reims"
        ), class = "factor")), .Names = c("V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
    -5L))
     
    # passage en matrice
    tab2 <- sapply(lapply(tab2, as.character), as.integer)
     
    # étiquette de la matrice
    dimnames(tab2) <- list(tab[-1,1], as.character(unlist(tab[1,-1])))
    tab2
          Paris Paris Reims
    Paris     1    10     2
    Reims     2    20     7
    Macon     8     0    11
    Reims    10     1    14
     
    library(reshape2)
    tab2 <- melt(tab2)
     
    # les sommes :
    aggregate(. ~ Var1 + Var2, tab3, sum)
       Var1  Var2 value
    1 Paris Paris    11
    2 Reims Paris    33
    3 Macon Paris     8
    4 Paris Reims     2
    5 Reims Reims    21
    6 Macon Reims    11
    cdlt

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonjour,

    Merci mgdondon et tototode pour vos réponses. Vos retours me sont d'une grande aide.

    Malheureusement, je ne peux appliquer la seconde méthode puisqu'elle impose de nommer les lignes et colonnes dans le script.
    Or, l'exemple que je vous ai proposé est un exemple simplifié mais en réalité, je travaille sur un tableau d'environ 1000 lignes x 1000 colonnes.
    Il ne m'est donc pas possible de procéder de la sorte, non pas par manque de courage... mais simplement parce que ce serait trop propice aux erreurs.

    mgdondon, peut-être que votre méthode est la bonne. J'ai du mal à maîtriser l'ensemble de ce qui est fait.
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.t$V2 <- villes$V1[match(df.t$V2, villes$V2, nomatch = NA)]
    semble poser problème.

    villes n'est plus un data.frame ce qui semble poser problème.

    si je rajoute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    villes <- as.data.frame(villes)
    ,
    l'étape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.t <- df.t[df.t$V2 != df.t$value,]
    renvoie 0 obs. of 2 variables au tableau df.t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'data.frame':	0 obs. of  2 variables:
     $ V1   : chr 
     $ value: chr
    Mais tout ça n'est pas bien clair.

    Je me demandais, à partir du tableau initial, n'est-il pas possible/préférable de passer par des boucles for, afin de lui demander de regarder, pour chaque cellule, le nom de la ville en colonne et le nom de la ville en ligne, puis de faire un compteur qui s'incrémente au fur et à mesure ?

    Une sorte de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pour i du tableau (de la matrice?),
       si le nom de la ligne XXX est "Paris" et le nom de la colonne YYY est "Macon"
          ou si le nom de la ligne XXX est "Macon" et le nom de la colonne YYY est "Paris",
    alors tu incrémentes le compteur,
    sinon, tu ne fais rien et tu passes à la cellule suivante
    Ce code (que je ne sais rédiger) me semblerait (en théorie) adapté, qu'en pensez-vous ?

  6. #6
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    Je ne saisis pas le sens de la remarque suivante, parce que de toute manière tu es obligé de nommer les villes que ce soit via les dimnames ou la fonction match de la solution de mgdondon. Il n'y aura pas d'erreurs dans le sens ou tu ne le fais pas à la main main en t'appuyant sur les données issues de ton objet. Que ce soit avec le dimnames ou la fonction match s'il y a une erreur dans ton jeu de données le code ne renverra pas le résultat attendu. Quelle que soit la méthode, l'association villes - données est toujours faites de manière automatique.
    Citation Envoyé par GDeLyon Voir le message
    Malheureusement, je ne peux appliquer la seconde méthode puisqu'elle impose de nommer les lignes et colonnes dans le script.
    Or, l'exemple que je vous ai proposé est un exemple simplifié mais en réalité, je travaille sur un tableau d'environ 1000 lignes x 1000 colonnes.
    Il ne m'est donc pas possible de procéder de la sorte, non pas par manque de courage... mais simplement parce que ce serait trop propice aux erreurs.
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tab2 <- tab[-1,-1]
    tab2 <- sapply(lapply(tab2, as.character), as.numeric)
    tab2 <- t(rowsum(t(tab2), factor(unlist(tab[1,-1]))))
    tab2 <- cbind(tab[-1,1,drop = F], tab2)
    colnames(tab2)[1] <- "Id"
    tab2 <- melt(tab2)
    aggregate(. ~ Id + variable, tab2, sum)
    cdlt

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Citation Envoyé par tototode Voir le message
    Bonjour,

    une autre possibilité avec la librairie reshape 2 :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # mise en forme de la matrice de données
    tab <- structure(list(V2 = structure(c(1L, 3L, 4L, 2L, 4L), .Label = c("id", 
    "Macon", "Paris", "Reims"), class = "factor"), V3 = structure(c(5L, 
    1L, 3L, 4L, 2L), .Label = c("1", "10", "2", "8", "Paris"), class = "factor"), 
        V4 = structure(c(5L, 3L, 4L, 1L, 2L), .Label = c("0", "1", 
        "10", "20", "Paris"), class = "factor"), V5 = structure(c(5L, 
        3L, 4L, 1L, 2L), .Label = c("11", "14", "2", "7", "Reims"
        ), class = "factor")), .Names = c("V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
    -5L))
     
    # passage en matrice
    tab2 <- sapply(lapply(tab2, as.character), as.integer)
     
    # étiquette de la matrice
    dimnames(tab2) <- list(tab[-1,1], as.character(unlist(tab[1,-1])))
    tab2
          Paris Paris Reims
    Paris     1    10     2
    Reims     2    20     7
    Macon     8     0    11
    Reims    10     1    14
     
    library(reshape2)
    tab2 <- melt(tab2)
     
    # les sommes :
    aggregate(. ~ Var1 + Var2, tab3, sum)
       Var1  Var2 value
    1 Paris Paris    11
    2 Reims Paris    33
    3 Macon Paris     8
    4 Paris Reims     2
    5 Reims Reims    21
    6 Macon Reims    11
    cdlt
    J'ai voulu vous répondre vite et j'ai mal observé le code.
    Je vais, durant l'après-midi, tenter de bien m'imprégner de vos réponses.

    Juste, je me permets une question. Dans votre code tototode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab2 <- sapply(lapply(tab2, as.character), as.integer)
    n'y a-t-il pas un pb ? Car le tab2 n'apparaît pas au préalable.

  8. #8
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    il manque une ligne : tab2 <- tab[-1,-1]à mettre avant celle que tu cites.

    cdlt

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

Discussions similaires

  1. Requête SQL mettre des ligne dans des colonnes
    Par karim66 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/02/2012, 20h57
  2. [AC-2010] requête avec lignes et colonnes
    Par létudiant_access dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/01/2012, 12h49
  3. Requête pour modifier plusieurs lignes d'une colonne
    Par nvit24 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/08/2011, 00h42
  4. Requêtes plusieurs lignes, colonnes
    Par Vilukariok dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/01/2009, 13h37
  5. Requête : Transformer lignes en colonnes
    Par bleu_ciel dans le forum Access
    Réponses: 6
    Dernier message: 27/05/2006, 21h26

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