我想请教关于 xts 子类的建议。我正在xtsAttributes
为我的 xts 数字矩阵的每一列添加元数据信息。元数据包含一个字符串,其中包含每列的描述。
所以ncol(myxtsobject) = length(metadata)
。我还向对象添加了一个新类,比如myclass
. 现在我想编写方法[.myclass
扩展[.xts
函数,以便在子集 xts 矩阵时也相应地子集我的元数据。
例如:d <- myobject[,c(2,3,23)]
将d
在元数据属性中生成 3 列和适当的 3 个条目。
有人可以指导我如何在合理使用现有 xts 和矩阵子集函数的同时做到这一点吗?
更多细节......下面是我的对象的结构(只是一个简约的例子):
# creating the object
n <- 10
ind <- Sys.time() + 1:n
col <- sin(seq(from=0, to=2*pi, length.out=n))
col2 <- cos(seq(from=0, to=2*pi, length.out=n))
d <- xts(x=cbind(col,col2), order.by=ind)
KEY1 <- paste("desc k1 -",1:ncol(d))
KEY2 <- paste("desc k2 -",1:ncol(d))
xtsAttributes(d) <- data.frame(KEY1,KEY2,stringsAsFactors=F)
d <- structure(d, class = c("dm", "xts", "zoo"))
# resulting structure
str(d)
现在,有了这样一个对象,我想开发一组函数,允许子集与对象元数据 KEY1、KEY2 一致,所以如果我删除/选择第 2 列,我将从 KEY1 和 KEY2 中删除/选择相应的成员。
我目前正在使用这段代码,到目前为止它是有效的。重用 data.frame 和 xts 子集。这些 getMeta.dm(x) 和 is.dm(x) 是我的函数,功能很明显。
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#: subset.dm
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
subset.dm <- function(x,i,j,...) {
# get my metadata, returns data.frame
md <- getMeta.dm(x)
# metadata subset
md <- md[j,]
# xts subset
myclass <- class(x)
x <- as.xts(x)
x <- x[i,j,...]
# now again assembling md object
# TODO fu() for creating dm objects
xtsAttributes(x) <- md
class(x) <- myclass
if(is.dm(x)) return(x) else stop("result is not dm object")
}
`[.dm` <- subset.dm