manipulation de listes

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

François Roullier
Messages : 21
Enregistré le : 09 Déc 2005, 11:11

manipulation de listes

Messagepar François Roullier » 06 Déc 2006, 11:59

Bonjour à tous!

Voila une question que je me pose depuis un petit moment et qui revient en ce moment dans mon travail.
Je gere mes sorties de fonction sous forme de liste, format plutot pratique et permettant pas mal de possibilités, mais je bute sur un petit detail...
J'ai en sortie une liste de longueur n, chacun de ces n elements est egalement une liste (disons de longueur p), je souhaiterais selectionner uniquement le second element de mes n listes sans passer par une boucle.
Avec une boucle ca donnerait qqc comme ca :

# final est ma liste de sortie
# je veux le second tableau de chacun des n listes
n<-length(final)
for(i in 1:n) final[[i]][[2]]

Cette boucle n'est pas si mal, dans le sens ou ca fonctionne mais je suis sur qu'il y a bien mieux. Donc, j'en appelle a vos connaissances!!
Merci bien, et bon courage pour vos manipualtions de tableaux,

françois

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

Messagepar Logez Maxime » 06 Déc 2006, 12:08

Bonjour,


tu peux essayé :

Code : Tout sélectionner

lapply(final,function(x) x[[2]])


Le résultat resultat ressort comme une liste des deuxièmes éléments.

Maxime

François Roullier
Messages : 21
Enregistré le : 09 Déc 2005, 11:11

Messagepar François Roullier » 06 Déc 2006, 12:17

Pas mal!! Merci!!
Et pour aller plus loin, si je veux "rbinder" toutes ces sorties entre elles de maniere a n'avoir qu'un seul tableau??
Merci encore.

françois

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

Messagepar Logez Maxime » 06 Déc 2006, 12:41

re,

pour le coup je ne sais pas trop comment tu peux faire de façon direct avec une fonction du style lapply.

Tu peux essayé ça :

Code : Tout sélectionner

test <- lapply(final,function(x) x[[2]])
test <- lapply(test,function(x) t(x))
test <- as.data.frame(test)
test <- t(test)


Mais ce n'est pas tres satisfaisant parce que les noms des lignes ont changé mais au moins tu connais leur provenance.

Sinon je te conseille une fois que tu as sélectionnés que les deuxièmes atributs de faire une boucle avec un rbind :

Code : Tout sélectionner

test <- lapply(final,function(x) x[[2]])
final2 <- NULL
for (i in 1:length(test)){
final2 <- rbind(final2,test[[i]])
}


Je n'ai pas trouvé une autre façon de procéder.

Maxime

François Roullier
Messages : 21
Enregistré le : 09 Déc 2005, 11:11

Messagepar François Roullier » 06 Déc 2006, 12:46

Moi non plus, je n'ai rien trouvé d'autre que la boucle... mais bon ca fonctionne. En tout cas merci bien, et bonne journée.

françois

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 06 Déc 2006, 17:59

Voir ?do.call.

Exemple:

Code : Tout sélectionner

> Liste <- list(matrix(1:4, ncol = 2), matrix(5:10, ncol = 2))
> Liste
[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

[[2]]
     [,1] [,2]
[1,]    5    8
[2,]    6    9
[3,]    7   10

> do.call("rbind", Liste)
     [,1] [,2]
[1,]    1    3
[2,]    2    4
[3,]    5    8
[4,]    6    9
[5,]    7   10


Renaud

Romain François
Messages : 42
Enregistré le : 08 Déc 2005, 19:23
Contact :

Messagepar Romain François » 07 Déc 2006, 09:20

lapply(final,function(x) x[[2]])


... On peut utiliser lapply sans definir de fonction anonyme dans ce cas, et utiliser `[[` directement.

Code : Tout sélectionner

lapply( final, "[[", 2)


... et si le but et de rbind'er le tout :

Code : Tout sélectionner

do.call(rbind, lapply( final, "[[", 2) )


Romain
--
Romain François
Consultant R Indépendant
http://romainfrancois.blog.free.fr

François Roullier
Messages : 21
Enregistré le : 09 Déc 2005, 11:11

Messagepar François Roullier » 11 Déc 2006, 15:51

Ah, sacré Romain, je te reconnais bien là!
Merci en tout cas à tous ceux qui m'ont repondu!

François


Retourner vers « Questions en cours »

Qui est en ligne

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