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 :

Boucle/cbind sur des noms de colonnes de type caractère


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Août 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Boucle/cbind sur des noms de colonnes de type caractère
    Bonjour
    Je travaille actuellement sur une base de données comportant 60 séries (en temporel). J'ai deux bases de données: chacune se rapportant à une variable A et B.
    Voici un exemple reproductible de ma base (qui en réalité contient 60 noms et 51 années)

    Variable A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    annee nom1 nom2 om3 
    2002   39   56   31 
    2003   37   31   52 
    2004   51   58   51 
    2005   70   59   68 
    2006   41   43   37 
    2007   43   31   53


    Variable B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    annee nom1 nom2 nom3 
    2002   56   18   24 
    2003   72   52   59 
    2004   32   30   33 
    2005   33   34   51 
    2006   47   46   19 
    2007   19   32   25

    J'aimerais faire une boucle qui créerait la matrice suivante pour chaque nom :

    pour nom1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    annee var1 var2 
    2002   39   56 
    2003   37   72 
    2004   51   32 
    2005   70   33 
    2006   41   47 
    2007   43   19

    J'ai tout d'abord fait ceci (car je ne m’intéresse qu'aux individus représentés dans les deux bases de données)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    noms=as.matrix(intersect(colnames(df.var_A),colnames(df.var_B))) 
    DF.VAR_A=subset(df.var_A,select=noms) 
    DF.VAR_B=subset(df.var_B,select=noms)

    J'aimerais ensuite récuperer la série correspondante à chaque nom, à la fois pour la variable A et la variable B:

    Je récupère les années par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Année=DF.VAR_A[,"annee"]

    J'obtiens bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     DF.VAR_A[,"nom1"] 
    [1] 39 37 51 70 41 43
    J'aimerais maintenant créer un data frame pour chaque nom, comprenant l'année, les valeurs prises par la variable A et par la variable B.

    Je supprime "Année" du vecteur nom

    Puis j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA=NULL 
    for (i in 1:length(NAMES)){ 
    DATA[i]=cbind(Année,DF.VAR_A[,i],DF.VAR_B[,i]) 
    }

    Mais le message d'erreur suivant apparait:

    Messages d'avis :
    1: In DATA[i] = cbind(Année, DF.VAR_A[, i], DF.VAR_B[, i]) :
    le nombre d'objets à remplacer n'est pas multiple de la taille du remplacement

    En fait l'idée serait de récuperer les 3 dataframes (un pour chaque nom), pour ensuite appliquer une boucle (déjà programmée) à chacun.
    J'aimerais donc "automatiser" l'application d'une boucle à tous les individus (jusqu'à présent je remplaçais manuellement nom1 par nom2 etc..dans ma boucle suivante).
    Voila je ne sais pas si c'est très clair, je reconnais que c'est un peu du bricolage...
    Merci d 'avance pour votre aide !

  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 : 36
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Une petite idée rapide mais il y a sûrement moyen de faire mieux/plus propre et optimisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DATA=vector("list",length(NAMES))
     
    for (i in 1:length(NAMES))
    { 
              DATA[[i]]=cbind(Année,DF.VAR_A[,i],DF.VAR_B[,i]) 
    }
     
    names(DATA)<-NAMES
    Bonne continuation


    Cordialement,


    A.D.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Août 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup c'est exactement ce que je voulais faire.

    Une dernière question si je peux me permettre :
    Maintenant que j'ai obtenu mes 3 tableaux ( un pour chaque nom), comment réaliser une boucle qui se repete sur chacun d'entre eux ?
    Admettons que je veuille faire la somme de VAR_A et VAR_B pour chacune des années?
    Tout d'abord, j'ai légèrement modifié la boucle pour intégrer les noms de variables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA=vector("list",length(NAMES))
    
    for (i in 1:length(NAMES))
    { 
             DATA[[i]]=as.data.frame(cbind(Année,DF.VAR_A[,i],DF.VAR_B[,i]) )
    }
    names(DATA)<-NAMES
    colnames(DATA[[i]])=c("Année","VAR_A","VAR_B")
    Mais cela ne s'applique qu'au dernier bloc de la liste...

    EDIT:En fait, lorsque j'intègre names() et colnames() DANS la boucle, cela fonctionne: les colonnes sont bien renommées

    Ensuite,j'aurais tenté quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    somme=vector("list",length(DATA))
    SOMME=vector("list",length(DATA))
     
    for (i in 1:length(DATA)){
    	for (j in 1:length(Année)){
    somme[i]=DATA[,VAR_A]+DATA[,VAR_B]
    SOMME[j]=somme[i]
    		}
    	}
    Mais évidemment cela ne fonctionne pas...

    Merci d'avance

  4. #4
    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 : 36
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Je vous conseille de regarder d'un peu plus près la structure des éléments de type "list".
    Par exemple, pour accéder à la colonne "VAR_A" du premier élément de la liste "DATA", vous pouvez faire : DATA[[1]]$VAR_A.

    Je vous laisse essayer par vous-mêmes

    Après, si vous n'arrivez pas à implémenter vos calculs de somme, essayez de nous fournir une formule/explication car pour le moment je ne suis pas sûre de bien voir ce que vous souhaitez faire.

    Bonne continuation


    Cordialement,


    A.D.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Hello,

    Citation Envoyé par Lauren13 Voir le message
    Merci beaucoup c'est exactement ce que je voulais faire.

    Une dernière question si je peux me permettre :
    Maintenant que j'ai obtenu mes 3 tableaux ( un pour chaque nom), comment réaliser une boucle qui se repete sur chacun d'entre eux ?
    Admettons que je veuille faire la somme de VAR_A et VAR_B pour chacune des années?
    En repartant du DATA de A.D.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lapply(DATA,function(x){apply(x[,c(2,3)],1,sum)})
    renvoit ce que tu veux sous forme d'une liste de trois elements (un par nom), chacun étant un vecteur qui donne la somme de varA et varB pour chaque année.

Discussions similaires

  1. [bash] Boucle sur des noms de fichiers à espaces
    Par Le Furet dans le forum Linux
    Réponses: 8
    Dernier message: 16/12/2009, 07h59
  2. boucle sur des noms de répertoires
    Par machmalabala dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/08/2007, 11h34
  3. Boucle sur des lignes et colonnes
    Par Livet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2007, 19h45
  4. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55
  5. [JTable] Créer une JTable vide avec des noms de colonnes.
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 27/09/2005, 15h54

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