2009-10-30 5 views
18

J'ai une liste de listes qui ressemble à ceci: x[[state]][[year]]. Chaque élément de ceci est un cadre de données, et y accéder individuellement n'est pas un problème. Cependant, je voudrais recréer des trames de données sur plusieurs listes. Plus précisément, j'aimerais avoir autant de données que j'ai d'années, c'est-à-dire relier toutes les trames de données d'état au sein de chaque année. En d'autres termes, je voudrais combiner toutes mes données d'état, année par année, dans des bases de données séparées.rbind dataframes dans une liste de listes

Je sais que je peux combiner une seule liste dans une trame de données avec do.call("rbind",list). Mais je ne sais pas comment je peux le faire à travers les listes de listes.

+2

Par curiosité, pourquoi vous traitez avec des données de cette façon plutôt que d'avoir une grande trame de données avec toutes les données? –

Répondre

6

Vous pouvez faire quelque chose le long des lignes suivantes (je ne pouvais pas tester comme je l'ai pas une telle structure):

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

L'année d'extrait de fonction crée une liste contenant seulement les dataframes pour l'année donnée. Ensuite, vous les rbind ...

+2

Les choses se compliquaient avec la réponse ci-dessus, alors j'ai essayé votre approche, qui a fonctionné! Avec une petite modification. La première ligne renvoyait le dataframe que je cherchais. La deuxième ligne ne fonctionnait pas, alors je me suis tourné vers le paquet de Hadley. Cette commande renvoie une liste de données référencées parfaitement après votre première ligne: llply (my.list.of.years, function (mon.année) do.call (rbind, extract.year (my.year))) Génial, merci les gars d'aider! – bshor

+1

ldply() est encore plus rapide et efficace! – bshor

32

Réduire dans une première liste:

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

Merci pour l'aide rapide! Mais ce n'est pas exactement ce que je veux. Votre réponse me donne une SINGLE dataframe de tous les cadres de données dans la liste des listes (en utilisant unlist, une commande cool que je n'ai jamais connue). Mais j'aimerais une liste de 32 bases de données combinées, qui sont autant d'années que j'ai, qui combinent tous les états ensemble. La première ligne de vos réponses me donne une liste approximative de la longueur de l'année * (bien que pour une raison quelconque j'obtiens une longueur = 1584, pas 32 * 50 = 1600 comme je m'y attendais). Donc, je pense que c'est un indice ... – bshor

+0

Après un peu plus d'expérimentation, je pense que je vais quelque part. J'ai nommé les éléments de la liste d'état pour la première fois, de sorte que maintenant les éléments de la liste non listée (après la première commande de Hadley) ont maintenant des noms utiles comme "AL3" et "TX4". Maintenant, je dois combiner tous les 3 ensemble, tous les 4, et ainsi de suite. – bshor

+0

Oh mon garçon, je suppose que les expressions régulières font partie de la réponse alors. J'ai essayé grep ("1 $", noms (liste)) pour obtenir les listes qui sont nommées avec un "1" mais cela me fait toutes les années avec un 1 en eux, comme 11, 21, 31. J'ai essayé grep ("\ D1 $", noms (liste)) mais non go. – bshor