2010-09-30 50 views
4

J'essaie de lire des séries chronologiques à partir d'un fichier CSV et de les enregistrer sous forme de xts pour pouvoir les traiter avec quantmod. Le problème est que les valeurs numériques ne sont pas analysées.Lire xts à partir du fichier CSV dans R

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 colonne de quantité contient des données de caractères, mais devrait être numérique. Qu'est ce qui ne va pas avec mon code?

Répondre

8

La structure de données interne de zoo et xts est matrix, donc 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, donc vous pouvez être intéressé par xts::align.time. Ce code prendra Data et créera 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 souhaitez 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) 
}) 
+0

Voilà pourquoi il a travaillé sans colonne nom !!!! – Stas

+0

Quelle structure devrais-je utiliser pour lire à partir de CSV et être capable de créer un zoo avec seulement des données numériques? Merci – Stas

+1

Et pourriez-vous recommander un bon livre R? Il semble que j'ai besoin de quelque chose à lire pour commencer. – Stas

1

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 n'est pas destinée à être des données de séries chronologiques, mais est destinée à distinguer plusieurs séries chronologiques, une pour test1, une pour test2, etc., vous pouvez diviser sur la colonne 1 en utilisant split = 1 pour provoquer une telle division 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)