2010-01-20 24 views
14

我有名爲<InputData>.<TestName>.csv的文件名,我想爲每個測試製作圖表。我能看到的最好辦法是爲每個TestName創建一個R表。每個測試都會生成相同的數據列,所以我想將每個測試的所有數據都放入一個R數據表中,併爲輸入數據添加一列。如何將read.table()中的多個文件放入R中的單個表中?

我想要做的:

read.tables(c("B217.SE.csv", "C10.SE.csv"), sep=",") 

(例如)生產:

 Filename col1 col2 
1 B217.SE.csv  1  2 
2 B217.SE.csv  2  4 
3 C10.SE.csv  3  1 
4 C10.SE.csv  4  5 

什麼是做到這一點的正確方法?我不知道的一些現有功能?使用for循環在R語言中寫出它?

回答

12

我無法測試它在你的數據,但是你會希望使用apply型函數是這樣的:

data <- do.call("rbind", lapply(c("file1", "file2"), function(fn) 
      data.frame(Filename=fn, read.csv(fn) 
)) 

或者,您可以通過使用plyr簡化它。這裏有一個如何將工作粗略模擬(使用數據幀,而不是文件):

> df1 <- data.frame(c1=1:5, c2=rnorm(5)) 
> df2 <- data.frame(c1=3:7, c2=rnorm(5)) 

在這種情況下,我會用get代替read.csv

> data <- ldply(c("df1", "df2"), function(dn) data.frame(Filename=dn, get(dn))) 
> data 
    Filename c1   c2 
1 df1 1 -0.15679732 
2 df1 2 -0.19392102 
3 df1 3 0.01369413 
4 df1 4 -0.73942829 
5 df1 5 -1.27522427 
6 df2 3 -0.33944114 
7 df2 4 -0.12509065 
8 df2 5 0.11225053 
9 df2 6 0.88460684 
10 df2 7 -0.70710520 

編輯

採取馬雷克的建議,你可以覆蓋或創建自己的功能:

read.tables <- function(file.names, ...) { 
    require(plyr) 
    ldply(file.names, function(fn) data.frame(Filename=fn, read.csv(fn, ...))) 
} 

data <- read.tables(c("filename1.csv", "filename2.csv")) 
+0

在方式總的概括:'read.tables < - 功能(文件,...)ldply(文件,函數(f)data.frame(文件名= F,讀.csv(f,...)))'(然後我們可以傳遞參數到'read.csv') – Marek 2010-01-20 20:56:27

+2

我通常做類似'names(file.names)< - basename(file.names); ldply(file.names,read.csv)' - 那麼你不需要自己添加文件名列。 – hadley 2010-01-21 00:54:02

+0

這非常有幫助,謝謝! – Thelema 2010-01-21 17:31:23

10

嘗試這種情況:

## take files. 
files <- list.files(pattern=".csv") 
## read data using loop 
DF <- NULL 
for (f in files) { 
    dat <- read.csv(f, header=T, sep="\t", na.strings="", colClasses="character") 
    DF <- rbind(DF, dat) 
} 
+0

爲了通過文件名跟蹤數據,我非常希望從'f'變量中獲取名稱。我使用'工具'包使用'file_path_sans_ext'獲取文件名。唯一的警告是,它輸出與向量列/行ID(維度)。我怎麼才能得到這個名字? – bonCodigo 2017-04-09 07:52:38

相關問題