2012-01-23 11 views
10

Tengo un objeto xts, cuya primera columna es fecha-hora, seguida de OHLC. cuando escribopuedo escribir un objeto xts utilizando write.csv en R

>test 

imprime la salida correcta de la siguiente manera:

2010-09-08 15:13:00 115 115 110 115 
2010-09-08 15:14:00 120 125 115 125 

Sin embargo, cuando intento write.csv (prueba "test.csv") única que escribe el OHLC - ¿por qué . ¿Qué comando utilizo para escribir también la fecha y hora

esto es lo str (prueba) se parece a:

An ‘xts’ object from 2010-06-30 15:47:00 to 2010-09-08 15:14:00 containing: 
    Data: num [1:21757, 1:4] 215 220 205 195 185 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:4] "y.Open" "y.High" "y.Low" "y.Close" 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 

Respuesta

18

Sí se puede, y de la manera más fácil puede ser a través write.zoo:

R> write.zoo 
function (x, file = "", index.name = "Index", row.names = FALSE, 
    col.names = NULL, ...) 
{ 
    if (is.null(col.names)) 
     col.names <- !is.null(colnames(x)) 
    dx <- as.data.frame(x) 
    stopifnot(all(names(dx) != index.name)) 
    dx[[index.name]] <- index(x) 
    dx <- dx[, c(ncol(dx), 1:(ncol(dx) - 1))] 
    write.table(dx, file = file, row.names = row.names, col.names = col.names, 
     ...) 
} 
<environment: namespace:zoo> 
R> 

y aquí es un ejemplo completo:

R> mat <- matrix(rnorm(20),5,4, dimnames=list(NULL, LETTERS[1:4])) 
R> mat 
       A   B   C   D 
[1,] -2.5304768 0.5454043 0.754670 0.330617 
[2,] -0.5199045 0.3943289 -1.271524 -2.243113 
[3,] -0.0996277 -0.0513063 -0.846310 -0.140727 
[4,] 0.3819981 0.5230709 1.131108 2.398311 
[5,] 1.4366976 -1.7750772 0.193936 1.047754 
R> xmat <- xts(mat, order.by=Sys.Date() + seq(-4,0)) 
R> xmat 
        A   B   C   D 
2012-01-19 -2.5304768 0.5454043 0.754670 0.330617 
2012-01-20 -0.5199045 0.3943289 -1.271524 -2.243113 
2012-01-21 -0.0996277 -0.0513063 -0.846310 -0.140727 
2012-01-22 0.3819981 0.5230709 1.131108 2.398311 
2012-01-23 1.4366976 -1.7750772 0.193936 1.047754 

Así que ahora que tenemos nuestros datos, es sólo es cuestión de escribirlo:

R> write.zoo(xmat, file="/tmp/demo.csv", sep=",") 
R> system("cat /tmp/demo.csv") 
"Index","A","B","C","D" 
2012-01-19,-2.53047680387774,0.545404313269755,0.754669841541681,0.330616876246245 
2012-01-20,-0.519904544868541,0.394328857686792,-1.27152367237311,-2.24311276135881 
2012-01-21,-0.0996276931028331,-0.0513062656752562,-0.846309564748021,-0.14072731914499 
2012-01-22,0.381998053276389,0.523070920853495,1.13110826400249,2.39831100812159 
2012-01-23,1.43669757366164,-1.77507724264279,0.193935657150967,1.04775355172344 
R> 

edición el 25 ene 2012 Uso row.names=FALSE, no TRUE para suprimir nombres de fila doble. Y como row.names=FALSE es el valor predeterminado, elimínelo de la llamada.

+0

muchas gracias a Dirk, que es muy útil. – user1155299

+0

Dirk, he estado tratando de averiguar por unas horas cómo deshacerme de la columna de fecha duplicada en mi .csv, pero hasta ahora no he tenido suerte. Además, cuando ejecuto '> xmat [, 1] A 2012-01-21 -1.4232098 2012-01-22 0.1456240 2012-01-23 -0.6625430 2012-01-24 -0.3947322 2012-01-25 0.5433947', regresa la fecha de nuevo, mientras que solo quiero obtener los valores en A. es posible. – user1155299

+0

Lo sentimos, queremos 'row.names = FALSE', que es el valor predeterminado. He editado mi publicación en consecuencia. –

8

La manera más fácil es simplemente convertir a un marco de datos primero en su llamada write.csv.

es decir

write.csv(as.data.frame(test),"test.csv") 

y ya está.

Si abre esto en, por ejemplo, Excel, debe ahora tener su índice de fecha/hora en la columna A, con sus objetos OHLC en las columnas B: E

+0

Corto y al punto. ¡Gracias! –

0

Por qué no utilizar saveSymbols()?

ir fuera de la matriz que @Dirk Eddelbuettel proporciona en su respuesta

xmat <- xts(mat, order.by=Sys.Date() + seq(-4,0)) 
saveSymbols(xmat, file.path="/tmp/xmat.csv") 
+1

'saveSymbols' guarda un archivo .RData binario, no un csv – GSee

+1

¿Debo eliminar mi respuesta o dejarla pero marcarla como incorrecta? Quiero dejarlo para que otras personas puedan aprender de mi tontería. –

Cuestiones relacionadas