2016-07-21 4 views
1

Я пытаюсь импортировать файл CSV и в конечном итоге превратить их в XTS объекты в R.R: Петля через список файлов CSV, чтобы изменить формат даты и создавать XTS объекты

Каждый CSV имеет формат:

Date  Open High Low  Close Volume 
18-Jun-99 2.35 2.35 2.35 2.35 34000 
21-Jun-99 2.35 2.35 2.35 2.35 57317 
22-Jun-99 2.35 2.35 2.35 2.35 7000 

Проблема заключается в дате, однако функция внутри lubridate легко преобразует ее. Для отдельного CSV мой процесс выглядит следующим образом:

require(xts) 
CAR.csv <- read.csv("CAR.csv", header = TRUE) 
require(lubridate) 
CAR.csv$Date <- dmy(CAR.csv$Date) 
CAR.csv <- read.zoo(CAR.csv) 
CAR.csv <- as.xts(CAR.csv) 

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

setwd("C:/Users/Administrator/Desktop/data") 
library(xts) 
temp = list.files(pattern="*.csv") 
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i], header = TRUE)) 

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

Предыдущая версия моего цикла для CSV-файлов с правильным форматом даты был таков:

setwd("C:/Users/Administrator/Desktop/data") 
library(xts) 
temp = list.files(pattern="*.csv") 
toDate <- function(x) as.Date(x, origin = "2005-01-01") 
for (i in 1:length(temp)) assign(temp[i], as.xts(read.zoo((temp[i]), header = TRUE, sep = ",", FUN = toDate))) 

С точки зрения полностью воспроизводимый пример здесь является sample folder из CSV-файла, если требуется, однако я подозреваю, что это прямо для наиболее компетентных пользователей R.

Я, конечно же, буду очень благодарен за советы.

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

ответ

1
setwd("C:/Users/Administrator/Desktop/data") 
library(xts) 
library(lubridate) 

load_file <- function(file_name) { 
    csv_file <- read.csv(file_name, header = TRUE) 
    csv_file$Date.Time <- dmy(csv_file$Date.Time) 
    csv_file <- read.zoo(csv_file) 
    csv_file <- as.xts(csv_file) 

    csv_file 
} 

list_of_files = list.files(pattern="*.csv") 

data <- lapply(X = list_of_files, FUN = load_file) 

Код работает, определив функцию, когда дано имя файла в рабочем каталоге, считывает его и выполняет необходимые преобразования на этом одном файле. Обратите внимание, что в данных вашего примера столбец даты называется Date.Time, поэтому я изменил код, чтобы отразить это.

Вместо использования цикла я применил функцию к каждому отдельному имени файла в списке имен файлов, используя базовую функцию apply(...). Результатом этой операции является список, содержащий преобразованные данные, которые вы после. Чтобы получить доступ к каждому объекту данных, используйте data[[1]] и т. Д.

+0

Здравствуйте, @Alex, спасибо за вашу помощь. Подумайте, используя функцию и lapply, чтобы файлы csv были назначены отдельным объектам XTS в глобальной среде, а не одному объекту? Очень признателен. – trentcroad

+1

Мое удовольствие. Каждый элемент списка данных в моем коде выше - это отдельный объект XTS в глобальной среде. Вы можете назвать каждый элемент - например. 'names (data) <- list_of_files', чтобы вы могли ссылаться на них, такие как' data ['CDM.csv'] 'или' data $ CDM.csv', или вы могли просто переписать их другим именам - например 'first_xts_objext <- data [[1]]'. Надеюсь это поможет. –

+1

В качестве альтернативы, если вы хотите назначить каждый отдельный объект XTS отдельному объекту в глобальной среде, вы можете изменить последнюю строку функции 'load_file' как' assign (имя_файла, csv_file, envir = .GlobalEnv) '. Это должно оставить вас с объектами в глобальной среде с такими именами, как 'CDM.csv' и т. Д. –

1

Просто измените ваш для цикла к тому, что вы могли бы сделать с одним файлом:

for (i in 1:length(temp)){ 
    assign("new.tmp", read.csv(temp[i], header = TRUE)) 
    new.tmp$Date <- dmy(new.tmp$Date) 
    new.tmp <- read.zoo(new.tmp) 
    assign(temp[i],as.xts(new.tmp)) 
} 

Это может стоить немного времени, так как вы скопировать весь объект еще раз часто в каждой итерации цикла, но я думаю, что это самое простое решение.

+0

Спасибо за помощь с помощью этого метода @snaut. Мне нравится этот подход. Можно ли настроить петлю, чтобы каждый отдельный csv стал отдельным объектом XTS в глобальной среде? Большое спасибо – trentcroad

+1

Это должно быть в этом цикле, если он запущен в глобальной среде, 'assign (temp [i], value)' присваивает значение переменной с именем 'temp [i]'. – snaut

0

В общем, я предпочитаю инициализировать список перед циклом, читать и обрабатывать эти файлы, а затем сохранять их обратно в списке.

Основное преимущество такого подхода заключается в том:

  1. Поддержание чистоты окружающей среды
  2. Возможность использовать lapply делать ту же обработку для всех загруженных файлов
  3. Способность извлекать/Контроль процесса один файл, просто индексируя его либо по имени файла, либо по индексу

Образец кода:

paths.allFiles = list.files(pattern="*.csv") # Equivalent to "temp" 
processedCSVs = list() 

for(path.oneFile in paths.allFiles){ # hint: you can access the file names directly without indexing 
    csv = as.xts(read.zoo(path.oneFile, header = TRUE, sep = ",", FUN = toDate)) 
    processedCSVs[path.oneFile] = csv 
} 

lapply(processedCSVs, nrow) # Returns all the nrows of all files 
nrow(processedCSVs[[1]]) # Returns the nrows of the indexed file only 

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

  • Нет связанных вопросов^_^