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

+0

Спасибо за ответ ** JeremyS **. К сожалению, у меня более 30 файлов в каждой папке, поэтому я ищу более быстрый способ сделать это. Кроме того, что касается ответа ** ben au **, я не уверен, что бы это сработало. – Gokay

+0

этот пост с ответом также от JeremyS http://stackoverflow.com/questions/21107006/import-all-txt-files-in-folder-concatenate-into-data-frame-use-file-names-as-v показывает, как нужно делать то, что вам нужно –

2

Использование fread из data.table (что было бы быстрее)

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

+0

@Arun Спасибо за предложение. – akrun

Смежные вопросы