2010-03-06 18 views
22

Mi dispiace se questa domanda ha già avuto risposta. Inoltre, questa è la mia prima volta su StackOverflow.Ricombinazione di un elenco di Data.frames in un singolo frame di dati

Ho una domanda R per principianti su elenchi, frame di dati e merge() e/o rbind().

Ho iniziato con un pannello che assomiglia a questo

COUNTRY YEAR VAR 
A   1 
A   2 
B   1 
B   2 

Per motivi di efficienza, ho creato una lista che si compone di un fotogramma di dati per ogni paese ed eseguito una serie di calcoli su ogni singola data.frame. Tuttavia, non riesco a combinare i singoli frame di dati in un unico grande frame.

rbind() e merge() entrambi mi dicono che è consentita solo la sostituzione di elementi.

Qualcuno potrebbe dirmi cosa sto facendo male/e come ricombinare effettivamente i frame di dati?

Grazie

risposta

4

ci potrebbe essere un modo migliore per fare questo, ma questo sembra funzionare ed è semplice. (Il mio codice ha quattro linee in modo che è più facile vedere i passaggi; questi quattro potrebbe essere facilmente combinati.)

# 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

Grazie per lo script. Ha funzionato abbastanza bene, la mia unica preoccupazione è che non si aggiorna automaticamente se dovessi aggiungere un paese. (anche se suppongo che con un ciclo for lo potrei fare anch'io) – CGN

33

forse si vuole fare qualcosa di simile:

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

+0

Sfortunatamente, questo restituisce un errore (penso perché non tutti i pannelli sono bilanciati?) In entrambi i casi, il comando sopra ha funzionato. Grazie comunque. – CGN

+0

Questa soluzione funziona, ma è lenta – Kots

3

plyr è probabilmente migliore. Un altro approccio utile se i frame di dati possono essere diversi è quello di utilizzare Reshape:

library(reshape) 
data <- merge_recurse(listofdataframes) 

Guardate la mia risposta a this related question on merging data frames.

5

Si noti che la soluzione di base

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

sarà lento, se abbiamo molti dataframes. Una soluzione scalabile è:

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

che, dal docs, è il dplyr same as do.call("rbind", l) on data.frames, but much faster.

5

consente di utilizzare la funzione bind_rows per questo:

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) 
Problemi correlati