2014-12-07 51 views
2

我正在嘗試將許多數據幀一起綁定到單個海量數據框中。數據幀按順序命名,第一個命名爲df1,第二個命名爲df2,第三個命名爲df3等。目前,我通過明確鍵入數據幀的名稱將這些數據幀綁定在一起;然而,對於非常大量的數據幀(預計大約有10,000個數據幀),這是不理想的。許多數據幀的批量rbind.fill

這裏是一個工作示例:

# Load required packages 
library(plyr) 

# Generate 100 example data frames 
for(i in 1:100){ 
    assign(paste0('df', i), data.frame(x = rep(1:100), 
             y = seq(from = 1, 
               to = 1000, 
               length = 100))) 
    } 
} 

# Create a master merged data frame 
df <- rbind.fill(df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, 
      df11, df12, df13, df14, df15, df16, df17, df18, df19, df20, 
      df21, df22, df23, df24, df25, df26, df27, df28, df29, df30, 
      df31, df32, df33, df34, df35, df36, df37, df38, df39, df40, 
      df41, df42, df43, df44, df45, df46, df47, df48, df49, df50, 
      df51, df52, df53, df54, df55, df56, df57, df58, df59, df60, 
      df61, df62, df63, df64, df65, df66, df67, df68, df69, df70, 
      df71, df72, df73, df74, df75, df76, df77, df78, df79, df80, 
      df81, df82, df83, df84, df85, df86, df87, df88, df89, df90, 
      df91, df92, df93, df94, df95, df96, df97, df98, df99, df100) 

如何優化這個任何想法,將不勝感激。

+0

你忘了是在哪裏'rbind.fill'來自我們可以使用。 – 2014-12-07 22:18:58

+0

對不起 - 我更新了上面的代碼,以供其他人在以後可能有這個問題。 – Entropy 2014-12-08 15:21:37

回答

5

data.table::rbindlist。將fill設置爲true以處理缺失的值(如果有的話)。

rbindlist(mget(ls(pattern="df")), fill=TRUE) 

     x   y 
    1: 1 1.00000 
    2: 2 11.09091 
    3: 3 21.18182 
    4: 4 31.27273 
    5: 5 41.36364 
    ---    
9996: 96 959.63636 
9997: 97 969.72727 
9998: 98 979.81818 
9999: 99 989.90909 
10000: 100 1000.00000 
4

do.call來得方便。您指定的函數在參數列表上工作。

library(plyr) 
df.fill <- lapply(ls(pattern = "df"), get) 
df <- do.call("rbind.fill", df.fill) 

> str(df) 
'data.frame': 10000 obs. of 2 variables: 
$ x: int 1 2 3 4 5 6 7 8 9 10 ... 
$ y: num 1 11.1 21.2 31.3 41.4 ... 
+0

是的,儘管'mget(ls(pattern =「df」))'會稍微縮短列表的創建時間。 – thelatemail 2014-12-07 22:43:30

+0

是的,但你有姓名 – 2014-12-07 22:52:17

+0

我不完全確定你的意思,理查德? – 2014-12-08 09:03:33

0

bind_rowsdplyr

library(dplyr) 
res <- bind_rows(mget(paste0("df", 1:100)))