2014-09-01 21 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

相关问题