Domanda

Sto cercando di leggere serie tempo file CSV e salvarli come XTS essere in grado di elaborarli con quantmod. Il problema è che i valori numerici non vengono analizzati.

file CSV:

name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073

Codice 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)

Risultato:

                    name    amount
2010-09-23 19:00:00 "test1" "3"   
2010-09-23 19:00:00 "test2" "9"   

Vedere importo colonna contiene dati di carattere, ma dovrebbe essere numerico. Cosa c'è di sbagliato con il mio codice?

È stato utile?

Soluzione

La struttura interna dei dati di entrambi zoo e xts è matrix, quindi non è possibile mescolare i tipi di dati.


Basta leggere i dati con read.table:

Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)

I notare i dati hanno, frazioni di secondo, così si può essere interessati a xts::align.time. Questo codice avrà Data e creare un oggetto con una colonna per ogni "name" dai secondi.

NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
  align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )

Se si desidera creare oggetti test1 e test2 nel vostro ambiente globale, si può fare qualcosa di simile:

lapply( split(Data,Data$name), function(x) {
  assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})

Altri suggerimenti

Non è possibile combinare i dati numerici e carattere in un oggetto zoo o XTS; Tuttavia, se la colonna nome non è destinato ad essere dati di serie temporali, ma è piuttosto volta a distinguere tra più serie temporali, uno per test1, uno per test2, ecc allora si può dividere in colonna 1 utilizzando split = 1 per provocare tale suddivisione come mostrato nel seguente codice. Assicurarsi di impostare le digits.secs, altrimenti non sarà possibile vedere i sub-secondi su uscita (anche se ci saranno, in ogni caso):

options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top