Читайте XTS из файла CSV в R
-
26-09-2019 - |
Вопрос
Я пытаюсь прочитать временные ряды из файла 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)