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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top