R xts和data.table
我可以将data.table转换为xts对象,就像我使用data.frame一样:R xts和data.table,r,xts,data.table,R,Xts,Data.table,我可以将data.table转换为xts对象,就像我使用data.frame一样: > 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
> 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"
将data.table与xts一起使用是否存在任何问题?只是为了解决一个未决问题 正如文森特在评论中指出的那样,这没有任何问题 它包含在数据表1.9.5中。以下是类似的内容:
as.data.table.xts由于的原因,通常在所有列名中嵌入符号的xts
。(例如,“间谍打开”、“间谍高”等)。因此,这里是Jan的as.data.table.xts
的替代方案,它将符号放在一个单独的列中,这在data.table
s中更为自然(因为在进行任何分析之前,您可能要先查找一组符号)
没有问题,但它是data.table的事实丢失了:数据被转换为矩阵(在xts对象内部)。在您的示例中,它甚至是一个字符串矩阵。我认为xts在其内部实现中保留了一个data.frame对象,只添加了时间索引作为属性。我在xts上运行的索引查询是本机查询,而不是data.frame或data.table查询吗?@RobertKubrick:xts与其父类(zoo)一样,使用带有索引属性的矩阵(而不是data.frame)。我明白了。因此,无论我在xts列上运行什么查询,比如myxts[myxts$Var1==“ABC”&myxts$Var2==“123”],实际上都是矩阵查询?如果您在posixct列上设置了data.table键,这不就涵盖了xts的功能吗?当然,有很多功能是为xts设计的,但是从长远来看,在posixct上使用带键的dt不是更好吗?很好--+1'ed。也许马特和阿伦可以将其拉入data.table本身。as.data.table.xts
函数将索引转换为character
,而as.xts.data.table
函数不允许xts
对象数字
(例如,一个全字符
xts
)@DirkEddelbuettel不确定,但链接回此处以讨论…我可以拥有一个包含一列xts的data.table吗?
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