2010-03-06 2 views
22

Je suis désolé si cette question a déjà été répondue. Aussi, c'est ma première fois sur stackoverflow.Recombinaison d'une liste de Data.frames dans une seule trame de données

J'ai une question R débutant concernant les listes, les trames de données et merge() et/ou rbind().

J'ai commencé avec un groupe qui ressemble à ceci

COUNTRY YEAR VAR 
A   1 
A   2 
B   1 
B   2 

Pour des raisons d'efficacité, je crée une liste qui se compose d'une trame de données pour chaque pays et effectué divers calculs sur chaque data.frame individuel. Cependant, je ne peux pas sembler combiner à nouveau les trames de données individuelles dans un grand cadre. Les deux

rbind() et merge() tous les deux me disent que seulement le remplacement des éléments est permis.

Quelqu'un pourrait-il me dire ce que je fais mal/et comment réellement recombiner les trames de données?

Merci

Répondre

4

Il pourrait y avoir une meilleure façon de le faire, mais cela semble fonctionner et il est simple. (Mon code a quatre lignes de sorte qu'il est plus facile de voir les étapes, ces quatre pourraient facilement être combinés.)

# first re-create your data frame: 
A = matrix(ceiling(10*runif(8)), nrow=4) 
colnames(A) = c("country", "year_var") 
dfa = data.frame(A) 

# now re-create the list you made from the individual rows of the data frame: 
df1 = dfa[1,] 
df2 = dfa[2,] 
df3 = dfa[3,] 
df4 = dfa[4,] 
df_all = list(df1, df2, df3, df4) 

# to recreate your original data frame: 
x = unlist(df_all)   # from your list create a single 1D array 
A = matrix(x, nrow=4)  # dimension that array in accord w/ your original data frame 
colnames(A) = c("country", "year_var")  # put the column names back on 
dfa = data.frame(A)  # from the matrix, create your original data frame 
+0

Merci pour le script. Cela a très bien fonctionné, mon seul souci avec ceci est qu'il ne se met pas automatiquement à jour si je devais ajouter un pays. (bien que je suppose avec un for-loop que je pourrais faire aussi,) – CGN

33

Peut-être que vous voulez faire quelque chose comme:

do.call("rbind", my.df.list)

+0

Malheureusement, ceci renvoie une erreur (je pense parce que tous les panneaux ne sont pas équilibrés?) De toute façon, la commande ci-dessus a fonctionné. Merci quand même. – CGN

+0

Cette solution fonctionne, mais elle est lente – Kots

3

plyr est probablement meilleur. Une autre approche utile si les trames de données peuvent être différentes est d'utiliser Reshape:

library(reshape) 
data <- merge_recurse(listofdataframes) 

Regardez ma réponse à this related question on merging data frames.

5

Notez que la solution de base

do.call("rbind", my.df.list) 

sera lente si nous avons beaucoup dataframes. Une solution évolutive est:

library(data.table) 
rbindlist(my.df.list) 

qui, du docs, est le same as do.call("rbind", l) on data.frames, but much faster.

5

dplyr vous permet d'utiliser la fonction de bind_rows pour que:

library(dplyr) 

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
     df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6))) 

bind_rows(foo) 
Questions connexes