2010-03-06 31 views
22

如果已經回答了此問題,則很抱歉。另外,這是我第一次在stackoverflow上。將Data.frames列表重組爲一個數據幀

我有一個初學者R有關列表,數據框和merge()和/或rbind()的問題。

我開始用面板,看起來像這樣

COUNTRY YEAR VAR 
A   1 
A   2 
B   1 
B   2 

出於效率的目的,我創建了一個包含每個國家的一個數據幀的名單和每個人data.frame進行各種計算。但是,我似乎無法再將各個數據幀合併爲一個大幀。

rbind()merge()都告訴我,只允許替換元素。

有人可以告訴我我做錯了什麼,以及如何實際重新組合數據框?

謝謝

回答

4

有可能是一個更好的辦法來做到這一點,但是這似乎工作,它的簡單。 (我的代碼有四行,使其更容易看到的步驟,這四個可以很容易地結合起來。)

# 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

謝謝你的腳本。它工作得很好,我唯一擔心的是它不會自動更新,如果我要添加一個國家。 (儘管我想用一個for-loop我也可以這樣做) – CGN 2010-03-07 05:05:57

33

也許你想要做的事,如:

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

+0

不幸的是,這會返回一個錯誤(我想因爲不是所有面板都是平衡的?)無論哪種方式,上述命令都起作用。謝謝你。 – CGN 2010-03-07 05:07:08

+0

該解決方案有效,但速度很慢 – Kots 2017-10-05 11:21:43

5

注意,基本解決

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

將是緩慢的,如果我們有很多dataframes。可擴展的解決方案是:

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

其中,從docs,是same as do.call("rbind", l) on data.frames, but much faster.

5

dplyr,您可以使用該功能bind_rows:

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) 
相關問題