création d'un data frame

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

création d'un data frame

Messagepar alexandre cavasino » 12 Juil 2017, 09:23

Bonjour,
je vous fait part de mon problème.
Je dispose d'une base de donnée (data) avec plein d'identifiant (composé de deux chiffres)

la base de donnée est comme ceci :

Code : Tout sélectionner

02   03   04   65   82   41   65   32


Je souhaiterais que chaque variable soit répétés 4 fois. J'ai donc essayé de faire un data frame avec la fonction rep et ensuite de faire un cbind ce qui fonctionne pour un seul identifiant mais quand j'essaye de faire le tout dans une même boucle je n'y arrive pas...

Voila le résultat que je souhaiterai obtenir :

Code : Tout sélectionner

02  02  02  02    03  03  03  03    04  04  04  04    65  65  65  65    82  82  82  82    41  41  41  41    65  65  65  65    32  32  32  32


Ainsi si initialement ma table data comportait 100 variables. Elle en comportera 400.
J'espère avoir été clair sur le problème.
Merci d'avance pour votre aide.

Bonne journée à tous

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: création d'un data frame

Messagepar Gabriel Terraz » 12 Juil 2017, 09:37

Salut,
La structure de tes données n'est pas claire du tout. Je vois deux possibilités :

1 - Tu as un vecteur :

Code : Tout sélectionner

v <- sample(50,5)
v
[1] 38 13 14 16 42
rep(v, each = 4)
 [1] 38 38 38 38 13 13 13 13 14 14 14 14 16 16 16 16 42 42 42 42


2 - Tes données sont des colonnes :

Code : Tout sélectionner

df <- data.frame(a =1:3, b = 3:1, c= letters[1:3])
df
  a b c
1 1 3 a
2 2 2 b
3 3 1 c
df[, rep(1:ncol(df), each = 3)]
  a a.1 a.2 b b.1 b.2 c c.1 c.2
1 1   1   1 3   3   3 a   a   a
2 2   2   2 2   2   2 b   b   b
3 3   3   3 1   1   1 c   c   c

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: création d'un data frame

Messagepar Pierre-Yves Berrard » 12 Juil 2017, 09:41

Comme ça ?

Code : Tout sélectionner

data[ , rep(names(data), each = 4)]

Par contre, les nouvelles colonnes auront un suffixe numéroté car deux colonnes d'un data.frame ne peuvent pas avoir le même nom.

edit : cf point 2 de Gabriel (qui tape plus vite que moi !)
PY

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: création d'un data frame

Messagepar alexandre cavasino » 12 Juil 2017, 13:56

merci pour vos réponses respectives.
par contre savez vous comment faire en sorte que les identifiants deviennent les variables (autrement dit pour virer les X1, X1.1 X1.2 X1.3... et les remplacer par le numéro d'identifiant adéquat).
Je souhaiterai également rajouter un suffixe sur les 4 identifiants.
je voudrais :

Code : Tout sélectionner

01_Avant    01_pendant    01_apres   01_jamais   


la même chose pour tout les autres identifiants.
Merci d'avance pour votre aide :)

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: création d'un data frame

Messagepar Gabriel Terraz » 12 Juil 2017, 14:23

Par exemple :

Code : Tout sélectionner

df <- data.frame(a =1:3, b = 3:1, c= letters[1:3])
df2 <- df[, rep(1:ncol(df), each = 4)
names(df2) <- paste(rep(names(df), each = 4), c("_Av","_pen","_apr","_jam"))
df2
  a _Av a _pen a _apr a _jam b _Av b _pen b _apr b _jam c _Av c _pen c _apr c _jam
1     1      1      1      1     3      3      3      3     a      a      a      a
2     2      2      2      2     2      2      2      2     b      b      b      b
3     3      3      3      3     1      1      1      1     c      c      c      c

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: création d'un data frame

Messagepar alexandre cavasino » 12 Juil 2017, 15:34

merci, je vais utiliser votre code pour mon programme, la seule différence est que ma base de donnée est comme ceci :

Code : Tout sélectionner

      X1  X1.1  X1.2  X1.3  X2  X2.1  X2.2  X2.3   
id    01   01    01    01   02  02    02    02


Je souhaiterais pour ma part que les identifiants deviennent les variables, equivalent d'un header = T je crois lors de l'importation.

Je veux obtenir :

Code : Tout sélectionner

      01_Av   01_pen    01_apr    01_jam   02_Av   02_pen    02_apr    02_jam 


les identifiants sont désormais les variables, je n'ai plus de X1 X1.1 .... en gros je souhaiterai remonter d'une ligne.
Merci pour votre aide en tout cas, c'est vraiment très aimable.

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: création d'un data frame

Messagepar Gabriel Terraz » 12 Juil 2017, 15:58

Comme quoi bien décrire son problème et ses données fait gagner du temps à tout le monde.

Il te manque seulement un -1 lors de la création du dataframe :

Code : Tout sélectionner

df <- data.frame(a =1:3, b = 3:1, c=
df2 <- df[-1, rep(1:ncol(df), each = 4)]
names(df2) <- paste(rep(names(df), each = 4), c("_Av","_pen","_apr","_jam"))
df
  a b c
1 1 3 a
2 2 2 b
3 3 1 c
df2
  a _Av a _pen a _apr a _jam b _Av b _pen b _apr b _jam c _Av c _pen c _apr c _jam
2     2      2      2      2     2      2      2      2     b      b      b      b
3     3      3      3      3     1      1      1      1     c      c      c      c

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: création d'un data frame

Messagepar alexandre cavasino » 13 Juil 2017, 09:32

désolé si j'ai manqué de précision dans mes messages précédents.
La commande que vous venez de m'indiquer supprime la premiere ligne de mon jeu de donnée.

ca c'est ce que j'ai :

Code : Tout sélectionner

X1   X1.1  X1.2  X1.2  X1.3  X2    X2.1  X2.2    X2.3  X3    X3.1     X3.2    X3.3
a _Av a _pen a _apr a _jam b _Av b _pen b _apr b _jam c _Av c _pen c _apr c _jam
2     2      2      2        2      2      2      2     b      b      b      b
3     3      3      3        1      1      1      1     c      c      c      c


en utilisant le -1 c'est la ligne avec a_Va a_pen qui s'en va comment faire pour que la premiere lignes qui représente les variables générées par R prenne les modalités de celle du dessous. Autrement dit que la premiere ligne devienne les variables de la table. Je souhaite obtenir la table suivante :

Code : Tout sélectionner


a _Av a _pen a _apr a _jam b _Av b _pen b _apr b _jam c _Av c _pen c _apr c _jam
2     2      2      2        2      2      2      2     b      b      b      b
3     3      3      3        1      1      1      1     c      c      c      c


cest à dire qu'en faisant names(table) j'obtienne a_Av a_pen a_apr b_....
merci d'avance

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: création d'un data frame

Messagepar Gabriel Terraz » 13 Juil 2017, 09:49

Je suis désolé mais quelque chose doit m'échapper car je ne comprend pas, j'ai l'impression que ces quelques lignes font exactement cela : enlever la première ligne (c'est ce que tu veux, non ?) pour en faire des noms de variable. Quelle est la différence entre ce que tu veux et df2 dans mon code ?

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: création d'un data frame

Messagepar alexandre cavasino » 13 Juil 2017, 12:36

d'accord je vais essayer d'être plus clair car ma requête peut parraître dérisoire.
Si l'on se base sur votre jeu de données on va dire que les lettres a, b et c d e et f sont pour moi les identifiants.
Seulement dans mon jeu de donnée au dessus des identifiants j'ai X1 X2 X3 X4 ..... XN

Code : Tout sélectionner

         X1   X2   X3    X4   X5 ... XN   
id       a     b    c    d    e  ...  f         
nb       1     2    3    4    1  ...  6
cb       2     3    4    2    4  ...  7
         


ici X1 , X2 , X3 , X4 et X5 sont les variables. La commande names(data) me ressort ces dernières

en deux étapes ce que je cherche à obtenir serait :

1) faire des identifiants les variables :

Code : Tout sélectionner

         
         a     b    c    d    e  ...  f         
nb       1     2    3    4    1  ...  6
cb       2     3    4    2    4  ...  7
         


ainsi a, b, c, d, e et f sont devenus les variables de ma table. names(data) me ressortira ces derniers.

2) splitter en 4 catégorie chaque identifiant :

Code : Tout sélectionner

         
         a   a   a   a     b   b   b   b    c   c   c   c    d   d   d   d    e   e   e   e  ...  f   f   f   f         
nb       1   1   1   1     2   2   2   2    3   3   3   3    4   4   4   4    1   1   1   1  ...  6   6   6   6   
cb       2   2   2   2     3   3   3   3    4   4   4   4    2   2   2   2    4   4   4   4  ...  7   7   7   7 
         


j'espère avoir été plus clair que précédemment.
Merci d'avance

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: création d'un data frame

Messagepar Pierre-Yves Berrard » 18 Juil 2017, 08:57

Bonjour,

Lorsque vous importez vos données, peut-être pouvez-vous spécifier que le première ligne contient les noms de colonnes ?
Si c'est possible, ça éviterait toutes ces acrobaties pour reconstituer les en-têtes.
PY

alexandre cavasino
Messages : 34
Enregistré le : 13 Juin 2017, 08:14

Re: création d'un data frame

Messagepar alexandre cavasino » 18 Juil 2017, 10:23

le problème est qu'il s'agit d'une matrice transposée.
j'ai donc la table suivant qui s'appelle table

Code : Tout sélectionner

 
    X1   X2   X3   X4
id   01   02   03   04
val   1    2    3   4

je souhaite obtenir une nouvelle table (que j'appele table2) comme ci dessous :

Code : Tout sélectionner

 
     01   02   03   04
val   1    2    3    4


ainsi X1 X2 X3 et X4 sont supprimés et chaque identifiant (01 02 03 et 04) les ont remplacés et sont désormais les variables de la table (table2)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: création d'un data frame

Messagepar Mickael Canouil » 24 Juil 2017, 11:59

Bonjour,

il vous faut utiliser l'argument "check.names=FALSE" lors de l'importation des données.
En effet, R n'aime pas que les noms de colonnes commencent par un chiffre et ajoute donc un X avant lorsque "check.names = TRUE".

Ceci vient en complément des solutions proposées avant.

Cordialement
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité