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 :

Croiser la première colonne avec toutes les autres, une par une.


Sujet :

R

  1. #1
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Croiser la première colonne avec toutes les autres, une par une.
    bonjour,

    Je galère beaucoup sur un programme que je doit réaliser.

    En gros je dois créer un programme avec le logiciel R qui me permet de croiser différentes colonnes automatiquement, c'est à dire croiser la colonne 1 avec la colonne 2, ensuite la colonne 1 avec la colonne 2, colonne 1 avec la 3, etc. avec la colonne 1 comme colonne de base. En gros, je doit croiser la colonne 1 avec toutes les autres colonnes. J'ai testé énormément de choses. j'ai vraiment pas réussi.

    Voici une des multiples syntaxes que j'ai essayées :

    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for (i in DATAS_FLO_SBK_2[,1:289]) {
     p <- i + 1 
     Print(i)
     combn(3,2,function(x) table(DATAS_FLO_SBK_2[,x]))
     a <- table(DATAS_FLO_SBK_2[,1],DATAS_FLO_SBK_2[,i])
     return(a)
     View(a)
     }

    Si quelqu'un pouvait m'aider, please

    Cordialement M.Erkus

  2. #2
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je comprends ta demande de faire le lien entre plusieurs colonnes. Par contre je ne comprends pas ce que tu veux indiquer comme opération par croisé. Multiplié ou sommé ou une autre opération que je vais appeler f telque pour a et b numérique alors r = f(a,b).

    Pour "croiser" deux colonnes, tu peux donc faire
    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    Resutat <- f(Data$A,Data$B)

    Avec Resultat un élément de DataFrame.

    Si tu as plusieurs colonnes, tu peux faire quelque chose comme cela

    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Resultat<-Data$A
    for(i in names(Data[,2:289])){
    Resultat<-cbind(Resultat, f(Data$A,Data[,i]))}

    Je te laisse le soin de débuger mon code faute de temps de mon côté.

    Au plaisir de te lire.

  3. #3
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    D'abord, grand merci d'avoir répondu.
    Après correction il me cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in cbind(Resultat, f(DATAS_FLO_SBK_2$K2002_1_P_19_Spannkraft_Gehause_Spannen_a19,  : 
      could not find function "f"
    Merci de ton attention.

  4. #4
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Oui, mon but est de croiser la colonne 1 avec toutes les autres (ie. faire des croisements basiques), sauf que mon but est de faire un programme qui le fait tout seul

  5. #5
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    f est le nom que j'ai défini pour la règle que tu appelles croisé. "f" peut selon tes besoins définir la fonction somme, moyenne, concaténation ou une autre de ton choix.

    Au plaisir.

  6. #6
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par dev_ggy Voir le message
    f est le nom que j'ai défini pour la règle que tu appelles croisé. "f" peut selon tes besoins définir la fonction somme, moyenne, concaténation ou une autre de ton choix.

    Au plaisir.
    Mon but est juste d'afficher les 2 colonnes pour pouvoir les manipuler après, en gros colonne 1 avec colonne 2, après colonnes 3, 4, 5, 6... Si vous pouvez me guider, please, car là je galère vraiment... Pas du tout vu ces fonctions en cours...

  7. #7
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Est-ce cela que tu cherches à programmer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lapply( DATAS_FLO_SBK_2[,-1], table, DATAS_FLO_SBK_2[,1])
    ?
    En effet, ce code croise la colonne 1 avec toutes les autres colonnes et renvoie une liste dont les composantes ont comme nom le nom de la colonne croisée avec la colonne 1.

  8. #8
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Je n'arrive pas à afficher ensuite vos données sous forme de tableau, comment puis-je faire ?

    Voici ce que moi j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Resultattest1 <- test1$K2002.1.Q_09...Balance.speed.fast
    for(x in names(test1[,2:136])){
        Resultattest1 <-  table(test1$K2002.1.Q_09...Balance.speed.fast,test1[,x])
        (print(Resultattest1))
     
    }
     
    View(Resultattest1)
    Mais le problème de cette syntaxe est qu'elle fait le croisement normalement mais une fois venue au View, il ne me présente qu'un tableau et pas tous les autres.
    Comment je peux faire, please ? (avec le view à l'intérieur de la boucle aussi ça bug).

    Merci de votre attention.

  9. #9
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Le View étant en dehors de la boucle, il ne présente que la dernière valeur calculée. De toutes façon, afficher plus de 130 tableaux en même temps est une gageure que l'ordinateur risque de ne jamais relever. De plus, View ne visualise pas directement la table sous forme d'une matrice. De même afficher à la console plus de 130 tableaux en même temps n'est pas une excellente solution.

    Quelques solutions :

    res permet de conserver les résultat pour des manipulations ultérieures. C'est une liste.

    - La meilleure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    res <- lapply( DATAS_FLO_SBK_2[,-1], table, DATAS_FLO_SBK_2[,1])
    # Impression de toutes les tables
    lapply( res, print)
    # en utilisant View à la place print, visualisation de toutes les tables
    
    # impression d'une table particulière
    #    idx est le numéro ou le nom de la colonne
    print( res[[idx]])
    - Avec impression et visualisation dans la boucle (très mauvaise solution)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    res <- lapply( DATAS_FLO_SBK_2[,-1], function( x) { y <- table( x, DATAS_FLO_SBK_2[,1])
                                                                                           print( y)
                                                                                           View( y)
                                                                                           return( y) }

  10. #10
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Merci, tu assures.

    Juste deux questions : pour manipuler les colonnes que j'ai, je fais comment : R enregistre les données automatiquement dans sa base ou je dois les enregistrer moi-même (et comment) ?
    Et pour finir : on fait comment pour exporter automatiquement les croisements en csv ?

    Merci de ton attention.

  11. #11
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Qu'entends-tu par "enregistrer les données dans sa base" ? res est une variable qui existe dans l'espace de travail tant qu'elle n'est pas détruite par la fonction rm ou réécrite. Quand on sort de R, l'espace de travail est vidé sauf si on lui demande de le sauvegarder dans un fichier soit avec le nom standard, soit en lui donnant un autre nom. On peut toujours sauver à n'importe quel moment des données sous le format R par la fonction save.

    Pour sauver les tables dans un fichier csv, tu peux utiliser la procédure suivante qui met les tables les unes derrière les autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    write.table( res[[1]], file="prov.csv", sep=",")
    old.warn <- options( warn=-1)
    invisible( lapply( res[-1], write.table, file="prov.csv", sep=",", append=TRUE))
    options( old.warn)
    Tu peux aussi écrire, dans ce cas, les noms des colonnes (niveaux du facteur de la colonne 1) ne sont écrits qu'une fois au début du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    write.table( res[[1]], file="prov.csv", sep=",")
    invisible( lapply( res[-1], write.table, file="prov.csv", sep=",", append=TRUE, col.names=FALSE))
    Notes :
    1) étant donné que les noms des lignes sont enregistrés, les noms des colonne sont toujours décalés d'une colonne. read.table sait gérer cette situation mais il faut en tenir compte si tu utilises le fichier hors R.
    2) pour transformer une table de contingence en un data.frame représentatif de la matrice, il existe la fonction as.data.frame.matrix.

  12. #12
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Pourquoi le programme ne trouve pas "res" ? ou c'est moi qui n'ai pas complété quelque chose ?

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Resultattest1 <- test1$K2002.1.Q_09...Balance.speed.fast
    for(x in names(test1[,2:136])) {
        Resultattest1 <-  table(test1$K2002.1.Q_09...Balance.speed.fast,test1[,x])
        (print(Resultattest1))
        write.table( res[[1]], file="prov.csv", sep=",")
        old.warn <- options( warn=-1)
        invisible( lapply( res[-1], write.table, file="prov.csv", sep=",", append=TRUE))
        options( old.warn)
      }

    Merci de ton atttention.

  13. #13
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Parce que res n'est pas défini dans ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res <- lapply( DATAS_FLO_SBK_2[,-1], table, DATAS_FLO_SBK_2[,1])
    ce qui remplace avantageusement ta boucle.

    J'ai l'impression que tu n'as aucune notion de ce qu'est la programmation. Si tu veux continuer, il faudrait commencer par là puis ensuite te former sur la syntaxe de R. Une manière est de consulter aussi les pages d'aide des fonctions et d'essayer de refaire et comprendre les exemples.

  14. #14
    Provisoirement toléré
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 7
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    c'est juste que j'en avait pas fait depuis longtemps
    mais merci de ton aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/12/2012, 20h21
  2. Réponses: 0
    Dernier message: 20/04/2011, 16h25
  3. Réponses: 5
    Dernier message: 25/08/2009, 16h37
  4. Réponses: 1
    Dernier message: 16/02/2005, 13h04
  5. Réponses: 2
    Dernier message: 09/07/2003, 15h10

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