2012-01-23 1 views
10

私はxtsオブジェクトを持ちます。その最初の列は日時で、その後にOHLCが続きます。私はRでwrite.csvを使用してxtsオブジェクトを書き込むことができます

>test 

を入力すると、以下のように、それは正しい出力を出力します。

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

私はwrite.csv(テスト、 "のtest.CSV") をしようとすると、しかし、それだけでOHLCを書き込み - なぜ。どのようなコマンド私も日時

これを書くために使用するのですがstrが(テスト)は次のようになります。

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 

答えて

18

はいすることができますし、最も簡単な方法は、かもしれ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> 

、ここでは完全な例である:だから今、私たちは私たちのデータを持っていることを

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 

、それがありますこれを書いているだけの問題:

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> 

編集2012年1月利用row.names=FALSE 25上ではなく、TRUEは、複列の名前を抑制することができます。そして、row.names=FALSEがデフォルトであるため、コールから削除します。

+0

おかげで非常にダークで提供行列をオフに行く、それは非常に有用です。 – user1155299

+0

Dirk、私は.csvの重複した日付列を取り除く方法について、数時間前から理解しようとしていましたが、今まで運がなかったのです。また、 '' 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 '、それを返します私はAの値を取得したいだけですが、それは可能です。 – user1155299

+0

申し訳ありませんが、 'row.names = FALSE'がデフォルトです。私はそれに応じて私の投稿を編集しました。 –

8

最も簡単な方法は、write.csvコールで最初にデータフレームに変換することです。

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

すなわちすれば完了です。

は、Excel、たとえば、でこれを開く場合は、今すぐ列BでのごOHLCオブジェクトと、列Aにあなたの日付/時間インデックスを持つ必要があります:E

+0

ショート&ポイント。どうも! –

0

理由だけで(saveSymbolsを使用しませんか)?

@Dirk Eddelbuettelが彼の答え

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

'saveSymbols'はcsvではなく、バイナリの.RDataファイルを保存します – GSee

+1

私の回答を削除するか、それを残すべきですか?他の人が私の愚かさから学ぶことができるように、私はそれを残したい。 –