1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

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

    Par défaut Créer un dataframe à partir d'une boucle

    Bonjour à tous,

    Novice avec R, je n'arrive pas à solutionner mon problème, même si je pense avoir compris la démarche à suivre.

    J'ai un dataframe de ce type :

    Tet E1 E2
    A 2 3
    B 3 12
    C 32 9
    . . .
    . . .
    Z 12 3

    Ce que je cherche à faire, c'est créer un nouveau df de ce type :

    Tet E Val
    A 1 2
    B 1 3
    C 1 32
    . . .
    . . .
    A 2 3
    B 2 12
    C 2 9

    D'après ce que j'ai compris, il faut que je fasse une boucle, mais je suis perdu...

    Un peu d'aide svp

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    janvier 2012
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : janvier 2012
    Messages : 269
    Points : 713
    Points
    713

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    D=data.frame(Tet=letters,E1=1:26,E2=26:1,E3=26:51)
     
     
    L=lapply(1:3,function(i){ data.frame(Tet=D$Tet, E=i, Val=D[,i+1]) })#liste de dataframes
    do.call(rbind, L)#colle les dataframes de la liste
    lapply est équivalent à une boucle for mais renvoie les résultats dans une liste, ce qui est pratique.

  3. #3
    Membre habitué
    Inscrit en
    février 2011
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 69
    Points : 140
    Points
    140

    Par défaut

    Bonjour,

    dans ce cas il s'agit de passer d'un tableau au format "large" à un tableau au format "long", la fonction reshape est faite pour ça :
    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
    tab <- 
    structure(list(Tet = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
        E1 = c(2L, 3L, 32L), E2 = c(3L, 12L, 9L)), .Names = c("Tet", 
    "E1", "E2"), class = "data.frame", row.names = c(NA, -3L))
     
    tab
      Tet E1 E2
    1   A  2  3
    2   B  3 12
    3   C 32  9
     
    tabl <- reshape(tab, varying = 2:3, idvar = "Tet", direction = "long", sep ="")
    tabl
        Tet time  E
    A.1   A    1  2
    B.1   B    1  3
    C.1   C    1 32
    A.2   A    2  3
    B.2   B    2 12
    C.2   C    2  9
     
    colnames(tabl)[2:3] <- c("E","Val")
        Tet E Val
    A.1   A 1   2
    B.1   B 1   3
    C.1   C 1  32
    A.2   A 2   3
    B.2   B 2  12
    C.2   C 2   9
    Il y a pas mal de fonctions dans des packages autres que ceux de base qui permettent de faire ce genre de choses aussi. Par exemple dans le package reshape 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    library(reshape2)
    melt(tab, id.vars = "Tet", variable.name = "E", value.name = "Val")
      Tet  E Val
    1   A E1   2
    2   B E1   3
    3   C E1  32
    4   A E2   3
    5   B E2  12
    6   C E2   9
    Ou encore dans la librairie tidyr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    library(tidyr)
    gather(tab, key = "E", value = "Val", -1)
      Tet  E Val
    1   A E1   2
    2   B E1   3
    3   C E1  32
    4   A E2   3
    5   B E2  12
    6   C E2   9
    cdlt

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/10/2006, 16h28
  2. Calcul d'un taux à partir d'une boucle while
    Par zana74 dans le forum PHP & MySQL
    Réponses: 32
    Dernier message: 14/08/2006, 20h16
  3. créer 2 tables à partir d'une
    Par mussara dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/07/2006, 11h35
  4. Créer un rtf à partir d'une form
    Par akabane dans le forum Delphi
    Réponses: 2
    Dernier message: 07/06/2006, 11h18
  5. Réponses: 5
    Dernier message: 24/06/2005, 12h36

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