Bricole : utilisation de "rbind" avec "for

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

Stephane Barbier
Messages : 7
Enregistré le : 05 Sep 2007, 12:45

Bricole : utilisation de "rbind" avec "for

Messagepar Stephane Barbier » 04 Déc 2008, 10:50

Bonjour,

Une petite question encore...
La commande "1" ci-dessous fonctionne bien, mais pas la commande "2" : seul l'élément "get(list.r[2])" est conservé dans "a", il n'y a pas concaténation des deux.
(les objets get(list.r[i]) sont des data.frame avec des noms de colonnes identiques)

Code : Tout sélectionner

# commande "1" :
a <- rbind ( get(list.r[1]), get(list.r[2]) )

# commande "2" :
for (i in c(1:2))
a <- rbind ( get(list.r[i]) )


Est-ce que quelqu'un voit une erreur d'écriture ? (je ne suis pas trop habitué à la fonction "get") C'est probablement pas grand chose mais il y a un moment que je bloque !!

Merci.

S. Barbier

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

Messagepar Logez Maxime » 04 Déc 2008, 11:44

Re,

Le problème ici c'est que a chaque boucle tu écrases l'obet a pour lui assigner le résultat de get(list.r[i]). Donc au final tu ne vas garder le résultat que sur le dernier élément de ta boucle.

Code : Tout sélectionner

 a <- NULL
for (i in c(1:2))
a <- rbind (a,get(list.r[i]) )


Maxime

Stephane Barbier
Messages : 7
Enregistré le : 05 Sep 2007, 12:45

Messagepar Stephane Barbier » 04 Déc 2008, 13:30

merci bien. c'est vrai que c'était pas trop logique mon écriture.
Par contre j'ai d'autres souci avec "get".. Ce serait pour renommer des colonnes et en ajouter une. Quand je lance mes commandes sur plusieurs data.frame avec un "for" ça coince. Est-ce que j'ai encore un autre type d'erreur d'écriture ? ça me parait pourtant assez logique là.

Code : Tout sélectionner

# "a0001", "a0002", etc. sont des data.frame (à 3 colonnes)
# "h" est un vecteur, contenant les caractères "a0001", "a0002", etc. = noms de mes data.frame

# Commandes 1, qui fonctionnent (data.frame un à un) :
names(a0001) <- c("An", "Di", "Sp")
a0001$Site <- substring(h[1],2,5)

# Commandes 2 pour automatiser, qui ne fonctionnent pas :
for (i in 1:length(h))
{
names(get(h[i])) <- c("An", "Di", "Sp")
get(h[i])$Site <- substring(h[i],2,5)
}

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

Messagepar Logez Maxime » 04 Déc 2008, 13:47

Re,

Il va fallaoir d'urgence lire quelques docs sur R et son fonctionnement.

Il est normal que tu ne puisses pas changer le nom des colonnes d'un objet que tu n'as pas "enregistré" en mémoire. Le get te permet juste de récupérer un objet existant quelque part, mais si tu n'enregistres pas cet objet que tu as récupérer alors tu ne vas pas pouvoir le modifier. Si tu veux vraiment travailler sur les tableaux de départ alors il te faudra passer par des eval, parse ...

Code : Tout sélectionner

for (i in 1:length(h)) {
  eval(parse(text=paste("colnames(",h[i],") <- c(",paste(dQuote(c("An", "Di", "Sp")),collapse=","),")",sep="")))
  }
# pour le nom des colonnes tu peux aussi faire comme ceci :
eval(parse(text=paste(paste("colnames(",h,")",sep="",collapse=" <- ")," <- c(",paste(dQuote(c("An", "Di", "Sp")),collapse=","),")",sep="")))


Après dans la dernière partie du code je ne sais pas trop ce que tu veux faire ...

Maxime

Stephane Barbier
Messages : 7
Enregistré le : 05 Sep 2007, 12:45

Messagepar Stephane Barbier » 04 Déc 2008, 14:04

C'est sûr, j'ai quelques lacunes avec R..! Par contre les objets "a0001", "a0002" etc. sont bien créés, ce sont des data frames existants. Ainsi que "h" (vecteur).
Je vais essayer avec les fonctions que tu m'indiques ("eval" & "parse"), mais est-ce qu'il ne serait pas quand même possible de s'en tirer avec des commandes du style de celles que j'ai proposé ? Je soupçonne une simple erreur d'écriture, à cause des msg d'erreur que j'avais oublié de mentionner (ajoutés ci-dessous).

Code : Tout sélectionner

# Pour la première partie de mon code :
for (i in 1:length(h))
names(get(h[i])) <- c("An", "Di", "Sp")
# Erreur dans names(get(ess[i])) <- temp : impossible de trouver la fonction "get<-"

# Pour la deuxième partie de mon code (qui me sert à insérer une colonne "Site") :
for (i in 1:length(h))
get(h[i])$Site <- substring(h[i],2,5)
# Erreur dans get(ess[i])$Site <- substring(ess[i], 2, 6) : impossible de trouver la fonction "get<-"

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

Messagepar Logez Maxime » 04 Déc 2008, 14:13

Re,

A priori il n'est pas possible de s'en sortir avec le code que tu proposes. La fonction get te permet juste de récupérer un objet pas de le modifier en même temps d'ou le message d'erreur :
Erreur dans names(get(ess[i])) <- temp : impossible de trouver la fonction "get<-"


Tu aurais pu faire un truc dans le genre :

Code : Tout sélectionner

for (i in 1:length(h)) {
  a <- get(h[i]) # a partir de la tu peux travailler sur ton objet a
  colnames(a) <- c("An", "Di", "Sp")
  a$Site <- substring(h[i],2,5)
  assign(h[i],a)
  }

# ou encore :
for (i in h) {
  a <- get(i)
  colnames(a) <- c("An", "Di", "Sp")
  a$Site <- substring(i,2,5)
  assign(i,a)
  }


Maxime

Stephane Barbier
Messages : 7
Enregistré le : 05 Sep 2007, 12:45

Messagepar Stephane Barbier » 04 Déc 2008, 14:16

D'accord. Et merci encore pour tous ces petits dépannages.
Bonne fin de semaine,
Stéphane


Retourner vers « Questions en cours »

Qui est en ligne

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