2010-08-02 37 views
22

Tôi có XTS timeseries ở định dạng R sau và đang cố gắng xử lý, sắp xếp và sắp xếp lại trước khi xuất dưới dạng CSV cho công việc trong một chương trình khác.Làm cách nào để thay đổi XTS thành data.frame và giữ chỉ mục trong R?

head(master_1) 
        S_1 
2010-03-03 00:00:00 2.8520 
2010-03-03 00:30:00 2.6945 
2010-03-03 01:00:00 2.5685 
2010-03-03 01:30:00 2.3800 
2010-03-03 02:00:00 2.2225 
2010-03-03 02:30:00 2.0650 

str(master_1) 
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing: 
    Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr "S_1" 
    Indexed by objects of class: [POSIXt,POSIXct] TZ: 
    Original class: 'zoo' 
    xts Attributes: 
List of 1 
$ dateFormat: chr "Date" 

Và tôi muốn chuyển đổi này vào một data.frame vì vậy tôi có thể vận dụng nó một cách dễ dàng hơn và sau đó xuất khẩu sang một chương trình khác. Tuy nhiên, khi tôi sử dụng test1 <- as.data.frame(master_1) các test1 không có chỉ số (tức là ngày tháng và thời gian) có thể nhìn thấy,

head(test1) 
         S_1 
2010-03-03 00:00:00 2.8520 
2010-03-03 00:30:00 2.6945 
2010-03-03 01:00:00 2.5685 
2010-03-03 01:30:00 2.3800 
2010-03-03 02:00:00 2.2225 
2010-03-03 02:30:00 2.0650 

Nhưng Index không hiển thị,

str(test1) 
'data.frame': 4000 obs. of 1 variable: 
$ S_1: num 2.85 2.69 2.57 2.38 2.22 ... 

Và viết một csv write.csv(master_1, file="master_1.csv") không bao gồm thời gian hoặc ngày tháng. Tại sao điều này, và làm thế nào tôi có thể bao gồm dữ liệu/dữ liệu thời gian như một cột, do đó, nó được sử dụng trong các lệnh R khác và xuất khẩu đúng cách?

Cảm ơn bạn đã được trợ giúp.

Trả lời

35

Đó là vì ngày tháng là tên gọi trong data.frame của bạn. Bạn cần phải biến chúng thành một cột riêng biệt.

Hãy thử điều này:

data.frame(date=index(master_1), coredata(master_1)) 
+0

Điều này là chính xác. Để trả lời câu hỏi thứ hai: 'write.csv' không bao gồm chỉ mục vì chỉ mục là thuộc tính xts * *, không phải là một danh sách. Sử dụng 'write.zoo' để thay thế. –

+0

Cảm ơn Shane và Joshua, điều đó giúp tôi biết tôi đã đi sai ở đâu. – phrozenpenguin

+0

'' data.frame (date = index (master_1), value = coredata (master_1) [,]) '' để đổi tên biến trong một lần. – PatrickT

1

Shane là đúng. bạn có thể đang tìm kiếm chỉ mục (xts của bạn). Đây là một ví dụ tái sản xuất.

library(xts) 
example(xts) 
x = head(sample.xts) 
datefield = index(x) 
newdf = data.frame(x,datefield) 

Sau đó, bạn sẽ có thể chỉ cần xuất sang csv. Tất nhiên bạn cũng có thể đổi tên các hàng.

+0

eh, cảm ơn Joshua vì vậy nó KHÔNG phải là một rowname :) –

+0

Cảm ơn ran2 cho ví dụ. Tôi cũng có thể sử dụng rownames (x) nếu x không phải là một đối tượng XTS. – phrozenpenguin

-2

Một hình thức thanh lịch để thay đổi XTS để data.frame:

myDF <- as.data.frame(as.matrix(myXTS)) 
+0

Không cần 'as.matrix', và điều này không trả lời Câu hỏi:" viết một csv 'write.csv (master_1, file =" master_1.csv ")' không bao gồm thời gian hoặc ngày tháng. và làm cách nào để có thể bao gồm dữ liệu/dữ liệu thời gian dưới dạng cột, vì vậy nó được sử dụng trong các lệnh R khác và được xuất đúng cách? " – GSee

8

Đây là một chút của một bên, nhưng fortify(...) chức năng trong gói ggplot2 sẽ chuyển đổi một loạt các đối tượng đến khung dữ liệu phù hợp để sử dụng trong ggplot(...), bao gồm xts đối tượng.

library(xts) 
set.seed(1) # for reproducible example 
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9)) 

library(ggplot2) 
df <- fortify(master_1) 
head(df) 
#     Index master_1 
# 1 2010-03-03 00:00:00 1.937355 
# 2 2010-03-03 00:00:30 2.018364 
# 3 2010-03-03 00:01:00 1.916437 
# 4 2010-03-03 00:01:30 2.159528 
# 5 2010-03-03 00:02:00 2.032951 
# 6 2010-03-03 00:02:30 1.917953 

Vì vậy, nếu bạn đã sử dụng gggplot thì đây là cách dễ dàng để thực hiện. Lưu ý rằng chỉ mục đi vào một cột có tên là Index (vốn "tôi").

+0

Nhờ câu trả lời của bạn, tôi đã quản lý âm mưu xts trong ggplot2 http://stackoverflow.com/questions/35215579/how-to-plot-xts-in-ggplot2 – aelwan

5

Kể từ 1.9.6 Bạn có thể chuyển đổi trực tiếp từ/sang xts mà không làm mất lớp chỉ mục. Đơn giản như:

as.data.table(master_1) 

Chỉ số này được thêm vào như là cột đầu tiên trong kết quả data.table, nó vẫn giữ được chỉ số Date hay POSIXct lớp.

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