R 将xts对象中的每一列彼此相减

R 将xts对象中的每一列彼此相减,r,xts,R,Xts,我是一个学习编码的新手,拥有1000行10列的xts对象。我需要从每一列中减去每一列,创建一个新的xts对象,保留日期列。我曾尝试使用combn,但无法让它创建B-A结果,因为它创建了A-B。我正在寻找的是以下内容 DATA RESULT A B C ---> A-B A-C B-A B-C C-A C-B 2010-01-01

我是一个学习编码的新手,拥有1000行10列的xts对象。我需要从每一列中减去每一列,创建一个新的xts对象,保留日期列。我曾尝试使用combn,但无法让它创建B-A结果,因为它创建了A-B。我正在寻找的是以下内容

 DATA                                           RESULT
            A  B   C     --->               A-B   A-C  B-A  B-C  C-A  C-B
2010-01-01  1  3   5           2010-01-01   -2    -4    2    -2    4    2 
2010-01-02  2  4   6           2010-01-02   -2    -4    2    -2    4    2
2010-01-03  3  5   2           2010-01-03   -2     1    2     3   -1   -3 

我们可以使用
outer
来获得列名的成对组合,
subset
基于列名的数据集“xt1”,在
列表中获得差异

f1 <- Vectorize(function(x,y) list(setNames(xt1[,x]-xt1[,y],
                                         paste(x,y, sep='_'))))
lst <- outer(colnames(xt1), colnames(xt1), FUN = f1)
数据
d1我使用以下方法构建数据:

x <- zoo::zoo(
    data.frame(
        A = c(1, 2, 3), 
        B = c(3, 4, 5), 
        C = c(5, 6, 2)), 
    order.by = as.Date(c("2010-01-01", "2010-01-02", "2010-01-03")))

x您可以尝试使用
outer
获取列名的所有组合。Akrun-不熟悉outer。使用test作为我尝试过的xts对象:ZT在下面发布了一个解决方案。希望对
xts
对象有所帮助,因为没有名为“Date”的列。当我在xts属性之后使用str(test)时,它应该是
index
akun-my xts对象测试:它显示2$src:chr“yahoo”的列表$updated:POSIXct[1:1],格式:“2015-08-10 14:00:08”所以,当我使用test尝试您的代码时,它会给我NULL。这是原因吗?如果有的话,有没有关于如何修复的建议?Thanks@doug无论如何,我根据您显示的内容创建了一个xts对象,并得到了您显示的确切输出。@doug您是说
dimnames
属性中的
NULL
?在我的例子中,它是空的,因为我没有创建一个。我现在正努力学习逻辑,这样我就能成为一名更好的程序员。感谢您和akrun的帮助和快速响应。DougIn RStudio,单击一个函数并按F1阅读更多有关该函数的信息。祝你好运
 d1 <- data.frame(A=1:3, B=3:5, C=c(5,6,2))
 library(xts)
  xt1 <- xts(d1, order.by=as.Date(c('2010-01-01', '2010-01-02', '2010-01-03')))
x <- zoo::zoo(
    data.frame(
        A = c(1, 2, 3), 
        B = c(3, 4, 5), 
        C = c(5, 6, 2)), 
    order.by = as.Date(c("2010-01-01", "2010-01-02", "2010-01-03")))
cross <- function(x, y = x) {

    result <- list()

    for (a in unique(x)) {

        for (b in unique(y)) {

            result <- append(result, list(list(left = a, right = b)))
        }
    }

    result
}
# Build a list of column combinations
combinations <- cross(names(x), setdiff(names(x), names(x)[1]))

# Remove any entries where the left equals the right
combinations <- combinations[vapply(combinations, function(x) { x$left != x$right }, logical(1))]

# Build a user friendly list of names
names(combinations) <- vapply(combinations, function(x) { paste0(x$left, "-", x$right) }, character(1))

# Do the actual computation and combine the results into one object 
do.call(cbind, lapply(combinations, function(x, data) { data[, x$left, drop = T] - data[, x$right, drop = T] }, data = x))