Чтение xts из файла CSV в R

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

CSV-файл:

name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073

R-код:

library(xts)
ColClasses = c("character", "numeric", "character")
Data <- read.zoo("c:\\dat\\test2.csv", index.column = 3, sep = ";", header = TRUE, FUN = as.POSIXct, colClasses = ColClasses)
as.xts(Data)

Результат:

                    name    amount
2010-09-23 19:00:00 "test1" "3"   
2010-09-23 19:00:00 "test2" "9"   

См. столбец суммы, содержащий символьные данные, но ожидается, что он будет числовым. Что не так с моим кодом?


person Stas    schedule 30.09.2010    source источник


Ответы (2)


Внутренняя структура данных как zoo, так и xts равна matrix, поэтому вы не можете смешивать типы данных.


Просто прочитайте данные с помощью read.table:

Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)

Я заметил, что в ваших данных есть доли секунды, поэтому вас может заинтересовать xts::align.time. Этот код возьмет Data и создаст один объект со столбцом для каждого "name" в секундах.

NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
  align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )

Если вы хотите создать объекты test1 и test2 в своей глобальной среде, вы можете сделать что-то вроде:

lapply( split(Data,Data$name), function(x) {
  assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
person Joshua Ulrich    schedule 30.09.2010
comment
Какую структуру я должен использовать для чтения из CSV, а затем иметь возможность создавать зоопарк только с числовыми данными? Спасибо - person Stas; 30.09.2010
comment
И не могли бы вы порекомендовать какую-нибудь хорошую книгу по R? Кажется, мне нужно что-то почитать для начала. - person Stas; 30.09.2010
comment
@ user194635: Смотрите мои правки для ответа на ваш второй вопрос. Что касается хороших книг по R: поищите в SO ([r] [книги]), и вы найдете много ответов. - person Joshua Ulrich; 30.09.2010

Вы не можете смешивать числовые и символьные данные в объекте зоопарка или xts; однако, если столбец имени не предназначен для данных временных рядов, а предназначен для различения нескольких временных рядов, одного для test1, одного для test2 и т. д., тогда вы можете разделить столбец 1, используя split=1, чтобы вызвать такое разделение как показано в следующем коде. Обязательно установите digits.secs, иначе вы не увидите субсекунды на выходе (хотя они будут там в любом случае):

options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)
person G. Grothendieck    schedule 01.10.2010