我無法測試它在你的數據,但是你會希望使用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"))
在方式總的概括:'read.tables < - 功能(文件,...)ldply(文件,函數(f)data.frame(文件名= F,讀.csv(f,...)))'(然後我們可以傳遞參數到'read.csv') – Marek 2010-01-20 20:56:27
我通常做類似'names(file.names)< - basename(file.names); ldply(file.names,read.csv)' - 那麼你不需要自己添加文件名列。 – hadley 2010-01-21 00:54:02
這非常有幫助,謝謝! – Thelema 2010-01-21 17:31:23