2015-06-24 2 views
1

У меня есть сотни файлов .csv, которые структурированы следующим образом:rbind() сотни .CSVs с метаданными имени файла

xyz25012013 <- data.frame(province = c("AB", "BC", "ON"), high = c(30, 20, 25), low = c(5, 2, 3)) 
xyz13122014 <- data.frame(province = c("AB", "BC", "ON"), high = c(20, 34, 25), low = c(1, 8, 3)) 
xyz30042014 <- data.frame(province = c("AB", "BC", "ON"), high = c(50, 21, 27), low = c(1, 9, 26)) 
xyz04072015 <- data.frame(province = c("AB", "BC", "ON"), high = c(26, 07, 90), low = c(4, 7, 3)) 

Я хочу, чтобы импортировать и присоединять/строки связывают все из них и сохранить дату метаданных содержащихся в имени файла.

as.Date(substr(<filename>,4,11) format = "%d%m%Y")

Я хочу, чтобы конечный результат, чтобы выглядеть вроде этого:

date <- c(rep("25012013", 3), rep("13122014", 3), rep("30042014", 3), rep("04072015", 3)) 
xyz <- rbind(xyz25012013, xyz13122014, xyz30042014, xyz04072015) 
xyz <- cbind(xyz, date) 
xyz$date <- as.Date(xyz$date, format = "%d%m%Y") 
print(xyz) 
+0

выглядит как некоторые вариации [это] (http://stackoverflow.com/questions/8091303/merge-multiple-data-frames -in-a-list-only) –

+0

как насчет 'list.files (pattern =" xyz ")' получать даты с 'substr', а затем' rbind', возможно, с 'tapply' /' lapply' – mts

ответ

3

Я думаю, что это делает то, что вы хотите и должны быть относительно эффективным:

## Create a file list to operate on: 
files <- list.files(path=".", pattern="*.csv") 

## Read in our data from each CSV into a list structure: 
csvs <- lapply(files, function(x) { 
    d <- read.csv(x); 
    d$date <- as.Date(substr(x,4,11), format="%d%m%Y"); 
    d 
}) 

## rbind our CSV data together: 
d <- do.call(rbind, csvs) 

Результат:

> head(d) 
    X province high low  dates 
1 1  AB 26 4 2015-07-04 
2 2  BC 7 7 2015-07-04 
3 3  ON 90 3 2015-07-04 
4 1  AB 20 1 2014-12-13 
5 2  BC 34 8 2014-12-13 
6 3  ON 25 3 2014-12-13 
+1

Попробуйте обновить, чуть более эффективный вызов (он использует только один «apply»/loop и избегает «rep()». –

+0

Теперь обновленная функция (когда я пытаюсь ее создать) выбрасывает: «Ошибка в' $ <-. Data.frame' ('* tmp *', "date", value = NA_real_): Замена имеет 1 строка, данные имеют 0 " – emehex

+1

Вы уверены, что все файлы в списке файлов являются CSV и имеют в них данные? Эта ошибка подразумевает, что что-то пошло не так с вызовом 'read.csv()'. –

2

Пусть все ваши файлы находятся в «тестовом» папку:

library(readr) 
files = list.files("test/") 
dd = vector("list", length = length(files)) 
for (i in seq_along(files)){ 
    dd[[i]] = read_csv(file = paste0("test/", files[i])) 
    dd[[i]]$date = as.Date(substr(files[i], 4, 11), format = "%d%m%Y") 
} 

merged = do.call(rbind, dd) 
Смежные вопросы