Appel d'une variable à partir d'une chaine de caractères.

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

Varin Thibault
Messages : 31
Enregistré le : 08 Nov 2006, 11:23

Appel d'une variable à partir d'une chaine de caractères.

Messagepar Varin Thibault » 05 Mar 2007, 15:21

Bonjour je n'arrive pas à trouver comment on peut appeler une variable à partir d'une chaine de caractères.
Par exemple j'ai plusieurs matrices nomées MNxyz et je voudrais utiliser la fonction paste pour les appeller :
x<-1
y<-1:4
z<-2
série[1:4]<-paste("MN",x,y,z)
mais ensuite je ne sais pas comment on peut utiliser cette variable série pour avoir accès au contenu de la matrice.
Par exemple série[1][,2] ne donne aucun résultats car c'est une chaîne de caractères. J'ai fait pas mal de recherches mais je ne trouve pas.
Merci beaucoup!!!

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 05 Mar 2007, 15:59

je ne comprend pas grand chose à ta demande mais j'ai l'impression que tu mélanges le terme nommer et appeler, ce dernier ayant une signification bien précise dans le langage S. Appeler un objet c'est le faire apparaitre en quelques sortes. Dans une fonction cela permet de l'utiliser, tandis que l'appeler tout simplement c'est examiner son contenu.

Evite les noms 'objet avec accent : pour série prend plutot serie

Il nous manque des infos pour comprendre ce que tu fais et ce que tu veux faire. Ton paste tel qu'il est écrit ne peut fonctionner. Tu lui dit de prendre les 4 première valeur de série et tu leur donnes comme valeur les valeurs de ton paste. Mais as tu spécifié avant ce qu'est série ?

Si tu veux utiliser les valeurs du paste comme nom des valeurs d'un vecteur il faut utiliser la fonction names().

série[1][,2] ne peut rien donner, ce n'est pas une syntaxe valide je crois ou alors je ne vois vraiment pas ce qu'est ton objet série.

Voilà bref quelques précisions seraient la bienvenue pour pouvoir t'aider

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

Messagepar Logez Maxime » 05 Mar 2007, 16:16

Bonjour,


Pourrais tu donner un exemple de ou de la matrice que tu as et de ce que tu veux récupérer dans cette matrice ? Car tu peux récupérer des objets à partir de chaîne de caractère :

Code : Tout sélectionner

x <- rnorm(100)
y <- rnorm(100)
ted <- data.frame(x,y)
bob <- "ted"
bob
[1] "ted"
ted2 <- get(bob[1]) # et tu récupères ted
all.equal(ted,ted2)
[1] TRUE


Maxime

Varin Thibault
Messages : 31
Enregistré le : 08 Nov 2006, 11:23

Messagepar Varin Thibault » 05 Mar 2007, 17:09

Désolé, c'est vrai que mon message n'est pas clair.
Je suis actuellement en train de comparer des méthodes de clustering hiérarchiques pour classer des individus.
J'utilise quatre (x<-1:4) types de descripteurs pour représenter mes individus.
Je calcul ensuite les matrices de distances avec 4 métriques (y<-1:4). Enfin j'utilise 5 méthodes de clustering différentes (z<-1:5).
Pour chaque combinaison de descripteur / métrique / méthode, je stocke différents indices dans des matrices que je nomme MNn° du descripteur/n°de la métrique/N°de la méthode.
J'obtiens donc donc 80 matrices MN nommés MNxyz. Ces matrices contiennent 20 colonnes.

Si par exemple je souhaite analyser la colonne 3 et comparer pour le premier descripteur et la première méthode les différentes métriques, je peux "récupérer" (?) manuellement mes données en tapant MN111[,3], MN121[,3], MN131[,3] et enfin MN141[,3]
Mais il s'avère que c'est un peu fastidieux si je veux comparer de manière exhaustive toutes les combinaisons.
Je pensais donc utiliser la fonction paste pour faciliter mes manipulations. par exemple
x<-descripteur<-1
y<-metric<-c(1,2,3,4)
z<-methode<-1
serie<-paste("MN",x,y,z,sep="")
et ensuite utiliser la fonction lapply (je ne l'ai pas encore utilisé mais je pense que c'est bien la fonction adaptée) pour effectuer mes différents calculs sur la colonne 3 des ces 4 combinaisons de paramètres.
si ensuite je veux comparer les même paramètres mais avec le descripteur 2 je n'ai plus qu'à taper
x<-2
serie<-paste("MN",x,y,z,sep="")
et continuer mes calculs.
Mais a priori la fonction get constitue ma solution car si je tape
plot(get(serie[,1][,3])), j'obtient bien le graphique désiré.
Cependant je n'arrive pas à comprendre pourquoi la ligne
plot(serie[,1][,3]) ne fonctionne pas?
Car quand je tape ls(), mes variables sont bien sous forme de caractères... elles sont affichées "MN111" par exemple...? Est-ce que quelqu'un peut m'expliquer cette différence?
Sinon, je nai pas bien compris la nuance entre nommer et appeler... il y a une différence entre afficher ma colonne 3 et effectuer des calculs sur ma colonne 3? Car pour moi ceci correspond à la même opération j'"extrait" les données de cette colonne de la même manière... C'est ensuite que j'effectue une opération différente. Ca m'interesse beaucoup, merci!!!
Cordialement

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 05 Mar 2007, 18:00

Sinon, je nai pas bien compris la nuance entre nommer et appeler.


oui j'ai mal tourné ma phrase il faut dire aussi...:)

appeler : faire venir l'objet (par exemple juste l'afficher, ou l'utiliser dans une fonction)

nommer : lui donner un nom quelqu'il soit.

Cependant je n'arrive pas à comprendre pourquoi la ligne plot(serie[,1][,3]) ne fonctionne pas?


la fonction plot() se rédige en spécifiant un x et un y. Déjà je ne vois pas ce que veux dire ta syntaxe. serie[,1] ça veut dire la colonne 1 de serie mais que veux tu faire en ajoutant [,3] derrière ? Ou alors c'est parce que j'ai du mal à voir sous quelle forme se présente ton objet serie.

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

Messagepar Logez Maxime » 06 Mar 2007, 08:27

Bonjour,


La fonction plot(serie[,1][,3]) ne fonctionne pas parce que serie est un vecteur de caractère à savoir que c'est une série de valeurs qui sont sous un format "texte". Il ya une différence entre une chaîne de caractère et un objet, si je tape "serie", alors la console me renvoie le texte "serie", mais si je tape serie, alors la console me renvoie l'objet serie et je dirai qu'heureusement que R fait la distinction entre les deux. Dans un cas j'ai donc un caractère et dans l'autre cas j'ai un objet. Lorsque tu tapes serie[,1][,3] déjà ça ne peux pas marcher parce que série n'a pas de dimension, ce n'est n'y une matrice n'y un tableau, mais même si tu tapais série[1] il te renverrai la première valeur du vecteur série qui est une chaîne de caractère, alors que get(serie[1]) lui te renvoie l'objet qui correspond à ce caractère. Donc plot serie n'a aucune chance de fonctionner car faire un plot d'une chaîne de caractère ce n'est pas possible. Comme Nicolas te l'a fait remarqué plot a besoin d'un x et d'un y qui soit numérique, ou bien une formule mais il faut des chiffres quelque part.

Maxime

Varin Thibault
Messages : 31
Enregistré le : 08 Nov 2006, 11:23

Messagepar Varin Thibault » 06 Mar 2007, 08:59

Ok merci
Effectivement j'ai encore une erreur puisque que c'est bien serie[1][,3]
Et donc cela marche bien en utilisant la fonction get.
En effet avec get(serie[1])[,3], j'apelle la colonne 3 de l'objet stocké au niveau de serie[1].
De plus la fonction plot considère comme x le numéro de la ligne correspondante et comme y la valeur enregistré dans la colonne 3 de ma matrice. Et donc c'est encore de ma faute j'ai recopié trop vite ma ligne (get(serie[1][,3])) ne peut évidemment pas marcher.
Merci beaucoup!!!

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

Messagepar francois guilhaumon » 17 Avr 2007, 14:59

bonjour,

Cette reponse est un peu tardive mais l'astuce fonctionne pour appeller des variables créées en serie :

Code : Tout sélectionner


#je créer 10 variables a la volée et je leur assigne un rnorm

for (i in 1:10) assign( paste("variable_",i,sep="") , rnorm(10) )

#je peu appeller ces variables pour les ploter par exemple

for (i in 1:10) plot(eval(parse(text=paste("variable_",i,sep=""))))



Le traitement présenté ici est trop trivial pour etre utile mais c'est l'esprit de la creation / appel des variables qui est important.


Retourner vers « Questions en cours »

Qui est en ligne

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