Прочитать XTS из файла CSV в R - PullRequest
       11

Прочитать XTS из файла CSV в R

4 голосов
/ 30 сентября 2010

Я пытаюсь прочитать временные ряды из файла 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"   

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

Ответы [ 2 ]

8 голосов
/ 30 сентября 2010

Внутренняя структура данных 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)
})
1 голос
/ 01 октября 2010

Вы не можете смешивать числовые и символьные данные в объекте zoo или 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)
...