2010-08-06 36 views
4

我注意到在R中編程時我經常遇到這個任務,但我不認爲我將它實現爲「漂亮」。將來自不同文件的數據彙總到數據結構中

我得到一個文件名列表,每個文件名都包含一個表格或一個簡單的矢量。我想將所有文件讀入一些構造(表列表?),以便稍後可以用簡單的循環操縱它們。

我知道如何將每個文件讀入表格/矢量,但我不知道如何將所有這些對象放在一個結構(列表?)中。

無論如何,我想這是非常例行的,所以我會很樂意聽到你的技巧。

+1

這真的是一個謝恩重複問題下面指出:http://stackoverflow.com/questions/2209258/merge-several-data-frames-into-one-data-frame-with-a-loop/2209371#2209371 – 2010-08-06 16:18:33

回答

2

,或在不plyr

filenames <- c("file1.txt", "file2.txt", "file3.txt") 
mydata <- array(list(NULL)) 

for (i in 1:length(filenames)) 
    { 
    mydata[[i]] <- read.table(filenames[i]) 
    } 
+0

+1不錯,簡單! – 2010-08-06 15:51:41

+1

但更好地預先分配列表,並且可能使用文件名:mydata < - vector(「list」,length(filenames));名稱(mydata)< - 文件名; ... mydata [[filenames [i]]] < - read.table(filenames [i]) – mdsumner 2010-08-08 22:23:14

+0

@mdsumner:預分配的優點是什麼?另外,通過這種方式,你可以將'read.table'語句放在一個'tryCatch'指令中,所以如果文件不存在/被破壞等,你最終會在'mydata'中得到一個NULL值,然後可以對它進行檢查在腳本 – nico 2010-08-09 06:55:18

3

是否所有的文件都有相同的列數?如果是這樣,我認爲這應該工作,把他們都放入一個數據框。

library(plyr) 
x <- c(FILENAMES) 
df <- ldply(x, read.table, sep = "\t", header = T) 

如果他們不都相同的列,然後用llply()代替

+0

+1有時他們這樣做。謝謝! – 2010-08-06 15:52:00

+0

即使文件沒有相同數量的列,這也可以工作。 – hadley 2010-08-06 23:51:11