can I write an xts object using write.csv in R

后端 未结 3 1292
逝去的感伤
逝去的感伤 2020-12-16 18:42

I have an xts object, the first column of which is date-time, followed by OHLC. when I type

>test

it prints the correct output as follo

相关标签:
3条回答
  • 2020-12-16 19:15

    The easiest way is simply to convert to a data frame first in your write.csv call.

    ie

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

    and you're done.

    If you open this up in, say, Excel, you should now have your date / time index in column A, with your OHLC objects in columns B:E

    0 讨论(0)
  • 2020-12-16 19:30

    Yes you can, and the easiest way may be via 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> 
    

    and here is a complete example:

    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
    

    So now that we have our data, it is just a matter of writing it:

    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> 
    

    Edit on 25 Jan 2012 Use row.names=FALSE, not TRUE to suppress double row names. And as row.names=FALSE is the default, remove it from the call.

    0 讨论(0)
  • 2020-12-16 19:35

    Why not just use saveSymbols()?

    Going off the matrix that @Dirk Eddelbuettel provided in his answer

    xmat <- xts(mat, order.by=Sys.Date() + seq(-4,0))
    saveSymbols(xmat, file.path="/tmp/xmat.csv")
    
    0 讨论(0)
提交回复
热议问题