2014-09-01 19 views
2

繼續前面的問題; consolidating data frames in R 使用lapply可以完美地讀取和合並多個csv文件。在保持身份的同時合併多個文件

我的問題是,說你也想創建和標識追加到基於你在讀這名合併數據集

例如,如果你有2個數據集和它們。

file 2014_1.csv;

Var1 Var2 
21 140 
2 134 
3 135 

file 2014_2.csv;

Var1 Var2 
21 131 
2 134 

我希望我的決賽桌看起來像這樣;

Var1 Var2 Period 
21 140 2014_1 
2 134 2014_1 
3 135 2014_1 
21 131 2014_2 
2 134 2014_2 

有沒有辦法做到這一點?

回答

2

好吧,我已經想通了。 下面的代碼將一個文件夾中的所有csv文件作爲一個id變量並將它們結合起來。

files <- list.files() 
files 
# read the files into a list of data.frames 
data.list <- lapply(files, function(.file){ 
    dat<-read.csv(.file, header = F) 
    dat$period<-as.character(.file) 
dat 
}) 
# concatenate into one big data.frame 
data.cat <- do.call(rbind, data.list) 
1

根據你以前的帖子,我建議這樣的事情

data.list <- cbind(lapply(files, read.csv), files) 
+0

中添加一個額外的列各帶cbind前的時期。即'file1 $ Period < - 「2014_1」'和其他文件相同。 – JeremyS 2014-09-01 02:36:13

+0

感謝您回覆** JeremyS **。不幸的是,我在每個文件夾中都有超過30個文件,所以我正在尋找更快的方法來完成它。另外,對於** ben au **的回覆,我不確定那會起什麼作用。 – Gokay 2014-09-01 03:10:41

+0

這篇文章的答案也由JeremyS http://stackoverflow.com/questions/21107006/import-all-txt-files-in-folder-concatenate-into-data-frame-use-file-names-as-v告訴你如何去做你需要的東西 – 2014-09-01 03:38:46

2

運用data.tablefread(這將是更快)

files <- list.files(pattern="\\d{4}_\\d.csv") 
library(data.table) 
library(tools) 


    rbindlist(
    lapply(files, function(x) cbind(fread(x), Period=file_path_sans_ext(x)))) 
    # Var1 Var2 Period 
    #1: 21 140 2014_1 
    #2: 2 134 2014_1 
    #3: 3 135 2014_1 
    #4: 21 131 2014_2 
    #5: 2 134 2014_2 

或者作爲建議由@Arun

rbindlist(lapply(files, function(x) fread(x)[,Period:=file_path_sans_ext(x)])) 
+1

我會用':='添加'Period'而不是'cbind'。 – Arun 2014-09-07 20:44:43

+0

@Arun感謝您的建議。 – akrun 2014-09-08 09:06:58

相關問題