【问题标题】:Difference between column of a xts zoo objectxts 动物园对象的列之间的差异
【发布时间】:2016-06-11 11:54:05
【问题描述】:

我有一个矩阵a,类(a):“xts”“zoo”

            EUSA.2 EUSA.3 EUSA.4 EUSA.5
2014-06-11 0.3140 0.4016 0.5230 0.6910
2014-06-12 0.3190 0.3965 0.5347 0.6950
2014-06-13 0.3180 0.3903 0.5320 0.6980
2014-06-16 0.3255 0.4129 0.5546 0.7267
2014-06-17 0.3180 0.4017 0.5280 0.6950
2014-06-18 0.3210 0.3922 0.5234 0.6921

此对象有 4 列,我正在尝试计算此对象中每两对之间的差异,预计“xts”“动物园”类中的另一个对象有 16 列。我使用了以下内容:

df<-outer(colnames(a),colnames(a),paste,sep="_")
b<-outer(1:ncol(a),1:ncol(a),function(x,y) (a[,x]-a[,y]))
colnames(b)<-df

并收到错误消息:

NextMethod() 中的错误: dims [产品 121] 与对象的长度不匹配 [54087] 另外:警告消息: 在dim&lt;-.zoo(*tmp*, value = c(dX, dY)) 中: 设置此尺寸可能会导致无效的动物园对象

有什么建议吗?

【问题讨论】:

  • 请提供一个可重现的例子
  • 还有一个问题,因为a[,x]- a[,y] 不是一个数字。它等于'a'的nrow。输出可以做成list,即b &lt;- outer(1:ncol(a),1:ncol(a), FUN= Vectorize(function(i,j) list(a[,i]-a[,j]))),然后试试do.call(cbind, b)

标签: r time-series xts zoo


【解决方案1】:

1)假设不同的列对的差异就足够了,试试combn:

library(xts)

a <- as.zoo(a)
a.combn <- combn(names(a), 2, function(nms) a[, nms[1]] - a[, nms[2]])
colnames(a.combn) <- combn(names(a), 2, paste, collapse = "-")
xts(a.combn, index(a))

给予(输​​出后继续):

           EUSA.2-EUSA.3 EUSA.2-EUSA.4 EUSA.2-EUSA.5 EUSA.3-EUSA.4
2014-06-11       -0.0876       -0.2090       -0.3770       -0.1214
2014-06-12       -0.0775       -0.2157       -0.3760       -0.1382
2014-06-13       -0.0723       -0.2140       -0.3800       -0.1417
2014-06-16       -0.0874       -0.2291       -0.4012       -0.1417
2014-06-17       -0.0837       -0.2100       -0.3770       -0.1263
2014-06-18       -0.0712       -0.2024       -0.3711       -0.1312
           EUSA.3-EUSA.5 EUSA.4-EUSA.5
2014-06-11       -0.2894       -0.1680
2014-06-12       -0.2985       -0.1603
2014-06-13       -0.3077       -0.1660
2014-06-16       -0.3138       -0.1721
2014-06-17       -0.2933       -0.1670
2014-06-18       -0.2999       -0.1687

2) 以下是无下标的替代方案。它创建了一个 3d 组合数组,将其简化为矩阵。在这种情况下,我们不必先转换为"zoo":

a.combn <- apply(combn(as.data.frame(a), 2, as.matrix), 3, `%*%`, c(1, -1))
colnames(a.combn) <- combn(names(a), 2, paste, collapse = "-")
xts(a.combn, index(a))

注意:这是a的可复制形式:

a <- structure(c(0.314, 0.319, 0.318, 0.3255, 0.318, 0.321, 0.4016, 
0.3965, 0.3903, 0.4129, 0.4017, 0.3922, 0.523, 0.5347, 0.532, 
0.5546, 0.528, 0.5234, 0.691, 0.695, 0.698, 0.7267, 0.695, 0.6921
), .Dim = c(6L, 4L), .Dimnames = list(NULL, c("EUSA.2", "EUSA.3", 
"EUSA.4", "EUSA.5")), index = structure(c(1402444800, 1402531200, 
1402617600, 1402876800, 1402963200, 1403049600), 
tzone = "UTC", tclass = "Date"), class = c("xts", "zoo"), 
.indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC")

【讨论】:

  • > a.diff colnames(a. diff) colnames<-(*tmp*, value = c("EUSA.1-EUSA.2", "EUSA.1- EUSA.3", : 'dimnames' [2] 的长度不等于数组范围 > xts(a.diff, index(a)) 结构错误(coredata(x), dim = dim(x), dimnames = x .attr$dimnames) : 'dimnames' [1] 的长度不等于数组范围
  • 对不起。我错过了一条线。先做a &lt;- as.zoo(a)。我会添加它。
  • 我怎样才能只获得相邻列的差异?例如2-3、3-4、4-5?
  • -t(apply(a, 1, diff))
  • @G.Grothendieck 谢谢!这非常有帮助。还有一种简单的方法可以重命名列吗?例如。 “a-b”、“b-c”等?
【解决方案2】:

我们需要Vectorizeouter

b <- outer(1:ncol(a),1:ncol(a), FUN= Vectorize(function(i,j) 
              list(a[,i]-a[,j])))
res <- do.call(cbind, b)
colnames(res) <- df
res
#           EUSA.2_EUSA.2 EUSA.3_EUSA.2 EUSA.4_EUSA.2 EUSA.5_EUSA.2 EUSA.2_EUSA.3 EUSA.3_EUSA.3 EUSA.4_EUSA.3 EUSA.5_EUSA.3 EUSA.2_EUSA.4 EUSA.3_EUSA.4 EUSA.4_EUSA.4 EUSA.5_EUSA.4 EUSA.2_EUSA.5
#2014-06-11             0        0.0876        0.2090        0.3770       -0.0876             0        0.1214        0.2894       -0.2090       -0.1214             0        0.1680       -0.3770
#2014-06-12             0        0.0775        0.2157        0.3760       -0.0775             0        0.1382        0.2985       -0.2157       -0.1382             0        0.1603       -0.3760
#2014-06-13             0        0.0723        0.2140        0.3800       -0.0723             0        0.1417        0.3077       -0.2140       -0.1417             0        0.1660       -0.3800
#2014-06-16             0        0.0874        0.2291        0.4012       -0.0874             0        0.1417        0.3138       -0.2291       -0.1417             0        0.1721       -0.4012
#2014-06-17             0        0.0837        0.2100        0.3770       -0.0837             0        0.1263        0.2933       -0.2100       -0.1263             0        0.1670       -0.3770
#2014-06-18             0        0.0712        0.2024        0.3711       -0.0712             0        0.1312        0.2999       -0.2024       -0.1312             0        0.1687       -0.3711
#           EUSA.3_EUSA.5 EUSA.4_EUSA.5 EUSA.5_EUSA.5
#2014-06-11       -0.2894       -0.1680             0
#2014-06-12       -0.2985       -0.1603             0
#2014-06-13       -0.3077       -0.1660             0
#2014-06-16       -0.3138       -0.1721             0
#2014-06-17       -0.2933       -0.1670             0
#2014-06-18       -0.2999       -0.1687             0

【讨论】:

  • 非常感谢,很有用
  • OP 需要 16 列作为输出。我需要说偏见吗?
猜你喜欢
  • 2015-03-23
  • 2016-06-14
  • 1970-01-01
  • 2012-02-27
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多