2012-02-15 34 views
12

tôi có thể chuyển đổi một data.table một XTS đối tượng cũng giống như tôi làm với một data.frame:XTS R và data.table

> df = data.frame(x = c("a", "b", "c", "d"), v = rnorm(4)) 
> dt = data.table(x = c("a", "b", "c", "d"), v = rnorm(4)) 
> xts(df, as.POSIXlt(c("2011-01-01 15:30:00", "2011-01-02 15:30:00", "2011-01-03 15:50:50", "2011-01-04 15:30:00"))) 
        x v   
2011-01-01 15:30:00 "a" "-1.2232283" 
2011-01-02 15:30:00 "b" "-0.1654551" 
2011-01-03 15:50:50 "c" "-0.4456202" 
2011-01-04 15:30:00 "d" "-0.9416562" 
> xts(dt, as.POSIXlt(c("2011-01-01 15:30:00", "2011-01-02 15:30:00", "2011-01-03 15:50:50", "2011-01-04 15:30:00"))) 
        x v   
2011-01-01 15:30:00 "a" " 1.3089579" 
2011-01-02 15:30:00 "b" "-1.7681071" 
2011-01-03 15:50:50 "c" "-1.4375100" 
2011-01-04 15:30:00 "d" "-0.2467274" 

Có bất kỳ vấn đề trong việc sử dụng data.table với XTS?

+3

Không có vấn đề, nhưng thực tế đó là một data.table bị mất: các dữ liệu được chuyển thành một ma trận (bên trong XTS đối tượng). Trong ví dụ của bạn, nó thậm chí là một ma trận của chuỗi. –

+0

Tôi nghĩ xts đang giữ một đối tượng data.frame trong việc thực hiện nội bộ của nó và chỉ thêm các chỉ mục thời gian làm các thuộc tính. Có phải các truy vấn lập chỉ mục tôi đang chạy trên các truy vấn gốc xts hơn là data.frame hoặc data.table không? –

+0

@RobertKubrick: xts, giống như lớp cha của nó (vườn thú), sử dụng ma trận (không phải là data.frame) với thuộc tính chỉ mục. –

Trả lời

17

Chỉ để giải quyết một câu hỏi mở.

Vì Vincent nhận xét không có vấn đề gì về điều đó.

Dữ liệu được bao gồm trong dữ liệu.table 1.9.5. Dưới đây là nội dung tương tự:

as.data.table.xts <- function(x, keep.rownames = TRUE){ 
    stopifnot(requireNamespace("xts") || !missing(x) || xts::is.xts(x)) 
    r = setDT(as.data.frame(x), keep.rownames = keep.rownames) 
    if(!keep.rownames) return(r[]) 
    setnames(r,"rn","index") 
    setkeyv(r,"index")[] 
} 

as.xts.data.table <- function(x){ 
    stopifnot(requireNamespace("xts") || !missing(x) || is.data.table(x) || any(class(x[[1]] %in% c("POSIXct","Date")))) 
    colsNumeric = sapply(x, is.numeric)[-1] # exclude first col, xts index 
    if(any(!colsNumeric)){ 
    warning(paste("Following columns are not numeric and will be omitted:",paste(names(colsNumeric)[!colsNumeric],collapse=", "))) 
    } 
    r = setDF(x[,.SD,.SDcols=names(colsNumeric)[colsNumeric]]) 
    rownames(r) <- x[[1]] 
    xts::as.xts(r) 
} 
+2

Đẹp - +1. Có lẽ Matt và Arun có thể kéo nó vào data.table chính nó? –

+0

Hàm 'as.data.table.xts' chuyển đổi chỉ mục thành' ký tự' và hàm 'as.xts.data.table' không cho phép đối tượng' xts' không phải là 'số' (ví dụ: tất cả' character' 'xts') – GSee

+0

@DirkEddelbuettel Không chắc chắn nhưng liên kết quay lại đây được thêm vào [# 882] (https://github.com/Rdatatable/data.table/issues/882) để thảo luận ... –

7

Do quantmod, người ta thường có một xts với các biểu tượng nhúng trong tất cả các tên cột. (ví dụ: "SPY.Open", "SPY.High", v.v.). Vì vậy, đây là một thay thế cho Jan của as.data.table.xts mà đặt biểu tượng trong một cột riêng biệt, đó là tự nhiên hơn trong data.table s (kể từ khi bạn có thể sẽ rbind một loạt các trước khi làm bất kỳ phân tích).

as.data.table.xts <- function(x, ...) { 
    cn <- colnames(x) 
    sscn <- strsplit(cn, "\\.") 
    indexClass(x) <- c('POSIXct', 'POSIXt') #coerce index to POSIXct 
    DT <- data.table(time=index(x), coredata(x)) 
    #DT <- data.table(IDateTime(index(x)), coredata(x)) 

    ## If there is a Symbol embedded in the colnames, strip it out and make it a 
    ## column 
    if (all(sapply(sscn, "[", 1) == sscn[[1]][1])) { 
    Symbol <- sscn[[1]][1] 
    setnames(DT, names(DT)[-1], sub(paste0(Symbol, "."), "", cn)) 
    DT <- DT[, Symbol:=Symbol] 
    setkey(DT, Symbol, time)[] 
    } else { 
    setkey(DT, time)[] 
    } 
} 

library(quantmod) 
getSymbols("SPY") 
as.data.table(SPY) 
      time Open High Low Close Volume Adjusted Symbol 
    1: 2007-01-03 142.25 142.86 140.57 141.37 94807600 120.36 SPY 
    2: 2007-01-04 141.23 142.05 140.61 141.67 69620600 120.61 SPY 
    3: 2007-01-05 141.33 141.40 140.38 140.54 76645300 119.65 SPY 
    4: 2007-01-08 140.82 141.41 140.25 141.19 71655000 120.20 SPY 
    5: 2007-01-09 141.31 141.60 140.40 141.07 75680100 120.10 SPY 
    ---                 
1993: 2014-12-01 206.30 206.60 205.38 205.64 12670100 205.64 SPY 
1994: 2014-12-02 205.81 207.34 205.78 207.09 72105500 207.09 SPY 
1995: 2014-12-03 207.30 208.15 207.10 207.89 69450000 207.89 SPY 
1996: 2014-12-04 207.54 208.27 206.70 207.66 89928200 207.66 SPY 
1997: 2014-12-05 207.87 208.47 207.55 208.00 85031000 208.00 SPY 
Các vấn đề liên quan