Вопрос

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

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

Это было полезно?

Решение

Внутренняя структура данных обоих 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)
})

Другие советы

Вы не можете смешивать числовые и символьные данные в зоопарке или объекте XTS; Однако, если в столбце Имя не предназначена для данных серии временных серий, а скорее предназначена для различения нескольких временных рядов, по одному для test1, один для test2 и т. Д. Тогда вы можете разделить на столбец 1, используя Split = 1, чтобы вызвать такое разделение Как показано в следующем коде. Обязательно установите цифры. Secs или, что вы не увидите подменные секунды на выходе (хотя они будут там в любом случае):

options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top