Indexation des classes d'une 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

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Indexation des classes d'une data.frame

Messagepar Julien Cattiaux » 18 Avr 2007, 13:51

Bonjour,

J'aimerais créer une data.frame en indexant le nom des classes. Pour prendre une exemple tout bête, j'aimerais pouvoir créer une data.frame X du style :

X$X1 X$X2 X$X3 ... X$Xi
1 2 3 ... i
1 2 3 ... i
1 2 3 ... i

etc..

Par exemple en utilsant une boucle for, on peut imaginer qqch du type :
for (i in 1:n) X$Xi = i

Le problème c'est que je n'arrive pas à coder mon indexation X$Xi.
J'ai essayé des trucs du style X$"paste("X",i,sep="")", mais je ne trouve pas.

Bref, quelqu'un sait-il comment faire ?

Merci,
Julien

PS. Plus généralement, est-il possible de créer des objets indexés avec une boucle for ? Par exemple créer les vecteurs Ci = i pour i de 1 à n ? Ce n'est qu'un problème de notation mais ça me perturbe !

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 18 Avr 2007, 13:59

Bonjour,


J'avoue ne pas trop comprendre ta question concernant ton tableau, que veux tu faire au juste ? Avoir un tableau avec des noms de colonnes qui vont de X1 à Xi ? Pour ce qui est de tes vecteurs :

Code : Tout sélectionner

for (i in 1:n){
assign(paste("C",i,sep=""),i)
}


Maxime

francois guilhaumon
Messages : 14
Enregistré le : 27 Mar 2007, 08:51
Contact :

Messagepar francois guilhaumon » 18 Avr 2007, 14:02

Salut,

Comme on m'a bien aidé je peu aussi essayer :

Code : Tout sélectionner


> X=vector()

> for (i in 1:5) X =cbind(X,rnorm(10))

> X
            [,1]       [,2]        [,3]       [,4]        [,5]
 [1,]  0.6947114 -1.0096054  0.71729851 -0.5257426  1.30788121
 [2,]  1.2196295  0.1039352  0.42766134  0.1006207  0.51593285
 [3,] -1.8342597  0.9707798  1.72424034  1.2425329 -1.35962611
 [4,] -0.3588286  0.3805592  0.01757429  0.5275620 -0.80332768
 [5,]  0.1921969  1.4153750  0.22195078 -1.9785048  0.97136408
 [6,] -0.7068555  0.5814947 -1.45045599  1.6905591 -0.04731972
 [7,]  1.6503878 -0.3184430 -0.41848054 -0.4667268 -2.00169656
 [8,] -0.0764083  0.5063045  0.19668280  0.3729124 -1.88896799
 [9,] -0.4823992 -3.0419294 -1.06585298  1.3378840 -1.26614246
[10,]  1.5879369  1.3176680  1.36749464 -0.2191124  0.36981608

> X=as.data.frame(X)

> names(X)
[1] "V1" "V2" "V3" "V4" "V5"

> names(X) = paste("X",seq(1:5),sep="")

> X
           X1         X2          X3         X4          X5
1   0.6947114 -1.0096054  0.71729851 -0.5257426  1.30788121
2   1.2196295  0.1039352  0.42766134  0.1006207  0.51593285
3  -1.8342597  0.9707798  1.72424034  1.2425329 -1.35962611
4  -0.3588286  0.3805592  0.01757429  0.5275620 -0.80332768
5   0.1921969  1.4153750  0.22195078 -1.9785048  0.97136408
6  -0.7068555  0.5814947 -1.45045599  1.6905591 -0.04731972
7   1.6503878 -0.3184430 -0.41848054 -0.4667268 -2.00169656
8  -0.0764083  0.5063045  0.19668280  0.3729124 -1.88896799
9  -0.4823992 -3.0419294 -1.06585298  1.3378840 -1.26614246
10  1.5879369  1.3176680  1.36749464 -0.2191124  0.36981608


Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 18 Avr 2007, 14:08

Avoir un tableau avec des noms de colonnes qui vont de X1 à Xi ?


Oui. En bouclant sur i.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 18 Avr 2007, 14:15

Re,

Alors dans ce cas tu n'as pas besoin de faire une boucle qui prend du temps surtout si le nombre de boucles est grand, je vais juste reprendre un peu l'exmple de François en faisant un peu plus simple :

Code : Tout sélectionner

X <- matrix(rnorm(50),10,5,dimname=list(1:10,paste("X",1:5,sep="")))
X <- data.frame(X)
X
           X1         X2          X3         X4         X5
1  -0.8566489  0.8243557  1.69234209 -0.2544798 -1.0041750
2  -0.3193501  0.9147760 -1.69621612  1.6079566 -0.6585745
3  -0.7590063 -1.9749732 -2.01382561  1.4147622  0.4347752
4  -0.4228096  0.5702143  1.05294073 -0.7921602  1.3939235
5  -1.1789152  0.7929355 -0.86026652  0.9888870  0.3874739
6  -0.3730618  1.2720516  0.09486975  0.5799103 -1.2118336
7   2.0177907 -1.6818393  1.37905975 -0.5360748  0.6415280
8   1.2134751  0.4447850  2.35167418  0.4818665  1.5376949
9   0.2774807 -1.2043584 -0.46789144  0.2675099 -0.1823853
10 -1.3995499  0.6426029 -0.98915974 -0.9682097  0.4069890

# Pour reprendre ton premier exmple :
X <- matrix(1:10,10,10,byrow=T,dimnames=list(1:10,paste("X",1:10,sep="")))
X <- data.frame(X)
X
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   1  2  3  4  5  6  7  8  9  10
2   1  2  3  4  5  6  7  8  9  10
3   1  2  3  4  5  6  7  8  9  10
4   1  2  3  4  5  6  7  8  9  10
5   1  2  3  4  5  6  7  8  9  10
6   1  2  3  4  5  6  7  8  9  10
7   1  2  3  4  5  6  7  8  9  10
8   1  2  3  4  5  6  7  8  9  10
9   1  2  3  4  5  6  7  8  9  10
10  1  2  3  4  5  6  7  8  9  10


Maxime

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 18 Avr 2007, 14:30

OK, mais en fait mon exemple était trop simple, du coup mon obstable était facile à contourner...

Je vais essayer de reformuler mon problème :
Si j'ai X une data.frame, avec A1 A2... A10 ses classes.
Je choisis alors i au hasard entre 1 et 10 et je veux afficher la classe Ai. Comment je l'écris ?
Vous voyez ? J'aimerais écrire X$Ai, mais bien sûr ça ne marche pas ! Vous savez quelle est la syntaxe exacte ?

Julien

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Messagepar Pierre Casadebaig » 18 Avr 2007, 14:43

Code : Tout sélectionner

X[,i]


Je comprends ta question dans le sens de l'affichage, mais pas trop dans le sens de la création du dataframe (il existe au départ ?) ... du coup j'ai l'impression de répondre à côté de la plaque.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 18 Avr 2007, 14:43

Re,

tu peux faire comme suit :

Code : Tout sélectionner

X[,paste("X",i,sep="")] # tu peux rajouter ",drop=FALSE après le paste pour ne pas perdre la structure

# ou encore :
X[paste("X",i,sep="")]


Maxime

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 18 Avr 2007, 14:54

Ah ah.. oui en effet, mais si mes classes ne sont pas dans l'ordre, du style non pas A1 A2 .. A10 mais A12 A34 A17 A2 etc..
C'est vrai que je peux m'en sortir facilement avec un which, toujours en utilisant la notation X[,..], mais ne peut-on pas s'en sortir plus simplement avec la notation X$.. ?

En tout cas merci bien..

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 18 Avr 2007, 14:59

Précision : je répondais à Pierre dans mon précédent message, je n'avais pas vu la réponse de Maxime.
Du coup ce message ne sert à rien, vu que la solution de Maxime marche parfaitement, mis à part le fait que je suis toujours étonné de voir que l'on ne peut pas utiliser la notation X$.. dans ce genre de cas !
Bref, merci à vous, je dormirai moins bête...

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 18 Avr 2007, 15:00

Re,

Du moment que tu te sers d'une boucle tu peux bien faire ce que tu veux soit un while soit un for a toi de voir ce qui est le plus intéressant pour toi. Le while n'étant qu'une boucle conditionnelle ... Si tes classes ne sont pas dans l'ordre alors a toi de rentrer le désordre dans ta boucle ...

Code : Tout sélectionner

for (i in c(12,34,17,2,etc)){
X[paste("X",i,sep="")]
}


Perso je ne serais pas faire avec les "$" dans une boucle et je n'en vois pas l'intérêt ici puique àa revient au même.

Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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