Lire XTS du fichier CSV dans R
-
26-09-2019 - |
Question
Je suis en train de lire des séries chronologiques à partir du fichier CSV et d'enregistrer eux XTS pour être en mesure de les traiter avec quantmod. Le problème est que les valeurs numériques ne sont pas analysées.
fichier CSV:
name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073
Code 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)
Résultat:
name amount
2010-09-23 19:00:00 "test1" "3"
2010-09-23 19:00:00 "test2" "9"
Voir la colonne quantité contient des données de caractères, mais devrait être numérique. Quel est le problème avec mon code?
La solution
La structure de données internes des deux zoo
et xts
est matrix
, de sorte que vous ne pouvez pas mélanger les types de données.
Il suffit de lire les données avec read.table
:
Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)
Je remarque que vos données ont subseconds, de sorte que vous pouvez être intéressé par xts::align.time
. Ce code se Data
et de créer un objet avec une colonne pour chaque "name"
par secondes.
NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )
Si vous voulez créer des objets test1
et test2
dans votre environnement mondial, vous pouvez faire quelque chose comme:
lapply( split(Data,Data$name), function(x) {
assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
Autres conseils
Vous ne pouvez pas mélanger les données numériques et de caractère dans un zoo ou un objet XTS; Cependant, si la colonne de nom ne vise pas à être des données de séries chronologiques, mais vise plutôt à établir une distinction entre séries temporelles multiples, un pour test1, un pour test2, etc., vous pouvez diviser sur la colonne 1 en utilisant divisée = 1 pour provoquer cette scission comme indiqué dans le code suivant. Assurez-vous de définir les digits.secs ou bien vous ne verrez pas les sous-secondes sur la sortie (bien qu'ils seront là en tout cas):
options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)