2013-06-28 3 views
1

Я пытаюсь объединить каталог, полный текстовых файлов с разделителями-запятыми, используя R, а также включает имя файла каждого файла в качестве новой переменной в наборе данных.Слияние файлов (и имен файлов) в R

Я использую следующие:

library(plyr) 
file_list <- list.files() 
dataset <- ldply(file_list, read.table, header=FALSE, sep=",") 

Может кто-нибудь пролить свет на то, как я хотел бы добавить имя файла для каждого файла для чтения в качестве новой переменной в наборе данных?

Большое спасибо,

-Jon

+1

Шаг 1: Вы можете написать функцию, которая принимает одно имя файла (путь), а затем читает в файле и добавляет соответствующий столбец? Шаг 2: Используйте эту функцию в 'ldply'. – joran

ответ

2

Вы можете просто сделать обертку вокруг функции read.table(), которая добавляет в переменной имени файла. Что-то вроде этого должно работать:

read.data <- function(file){ 
    dat <- read.table(file,header=F,sep=",") 
    dat$fname <- file 
    return(dat) 
} 

После этого вам просто нужно применить эту функцию к файлам данных. Поскольку вы не отправляли какие-либо данные примера, я не уверен, на что он похож, но на данный момент я предполагаю, что он чист, как может быть, и что rbind() достаточно, чтобы объединить их вместе, и в этом случае этот пример должен иллюстрировать, что функция в действии:

> data(iris) 
> write.csv(iris,file="iris1.csv",row.names=F) 
> write.csv(iris,file="iris2.csv",row.names=F) 
> dataset <- do.call(rbind, lapply(list.files(pattern="csv$"),read.data)) 
> head(dataset) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  fname 
1   5.1   3.5   1.4   0.2 setosa iris1.csv 
2   4.9   3.0   1.4   0.2 setosa iris1.csv 
3   4.7   3.2   1.3   0.2 setosa iris1.csv 
4   4.6   3.1   1.5   0.2 setosa iris1.csv 
5   5.0   3.6   1.4   0.2 setosa iris1.csv 
6   5.4   3.9   1.7   0.4 setosa iris1.csv 
> table(dataset$fname) 

iris1.csv iris2.csv 
     150  150 
+0

Дэвид, спасибо - ваше решение отлично работало. Теперь мне просто нужно разобраться, КАК это работает ... – Vadaar

+0

Вы очень приветствуете - сообщите мне, если какая-то часть запутывает, и я рад рассказать о том, что происходит. У вас было около 90% решения уже в вашем исходном посте, поэтому, если вы понимаете, что это не должно быть гораздо больше, чтобы принять участие. Кроме того, если этот ответ работает для вас, нажмите кнопку ответа на принятие. – David