2012-01-23 49 views
10

Tôi có đối tượng xts, cột đầu tiên trong số đó là ngày-giờ, theo sau là OHLC. khi tôi gõTôi có thể viết đối tượng xts bằng cách sử dụng write.csv trong R

>test 

nó in đầu ra chính xác như sau:

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

Tuy nhiên, khi tôi cố gắng write.csv (kiểm tra, "test.csv") nó chỉ viết các OHLC - tại sao . lệnh gì để tôi sử dụng cũng phải viết ngày thời gian

đây là những gì str (thử nghiệm) trông giống như:

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 

Trả lời

18

Có bạn có thể, và cách dễ nhất có thể thông qua 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> 

và đây là một ví dụ hoàn chỉnh:

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 

Vì vậy, bây giờ mà chúng tôi có dữ liệu của chúng tôi, nó là chỉ là vấn đề của văn bản đó:

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 trên 25 tháng 1 năm 2012 Sử dụng row.names=FALSE, không TRUE để ngăn chặn tên hàng tăng gấp đôi. Và như row.names=FALSE là mặc định, hãy xóa nó khỏi cuộc gọi.

+0

cảm ơn rất nhiều Dirk, đó là rất hữu ích. – user1155299

+0

Dirk, tôi đã cố gắng tìm ra một vài giờ bây giờ là làm thế nào để thoát khỏi cột ngày trùng lặp trong .csv của tôi, nhưng không có may mắn cho đến nay. Ngoài ra, khi tôi chạy '> 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', nó trả về ngày một lần nữa trong khi tôi chỉ muốn nhận được các giá trị trong A. là có thể. – user1155299

+0

Xin lỗi, chúng tôi muốn 'row.names = FALSE' là mặc định. Tôi đã chỉnh sửa bài đăng của mình cho phù hợp. –

8

Cách dễ nhất chỉ đơn giản là chuyển đổi sang khung dữ liệu trước tiên trong cuộc gọi write.csv của bạn.

tức

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

và bạn đã hoàn tất.

Nếu bạn mở này lên, nói, Excel, bạn nên bây giờ có chỉ số/thời gian ngày của bạn trong cột A, với các đối tượng OHLC của bạn trong cột B: E

+0

Ngắn và cho điểm. Cám ơn! –

0

Tại sao không chỉ cần sử dụng saveSymbols()?

Đi ra khỏi ma trận @Dirk Eddelbuettel cung cấp trong câu trả lời của ông

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

'saveSymbols' lưu tệp nhị phân .RData, không phải là csv – GSee

+1

Tôi có nên xóa câu trả lời của mình hay bỏ nó ra nhưng đánh dấu nó là không chính xác? Tôi muốn để nó như vậy ppl khác có thể học hỏi từ sự ngu ngốc của tôi. –

Các vấn đề liên quan