【问题标题】:Multiply all columns in an xts object by another single-column xts object将 xts 对象中的所有列乘以另一个单列 xts 对象
【发布时间】:2012-08-03 03:50:20
【问题描述】:
library(xts)
set.seed(1)
x = xts( cbind(a=1:10,b=20:11) , Sys.Date()+1:10 )
y = xts( runif(10) , Sys.Date()+1:10 )
z = x*y

给我*.default(x, y) 中的错误:不符合要求的数组

我想要的是将 x 中的每一列乘以 y 中的值。

预期结果:

                   a         b
2012-08-04 0.2655087  5.310173
2012-08-05 0.7442478  7.070354
2012-08-06 1.7185601 10.311361
2012-08-07 3.6328312 15.439532
2012-08-08 1.0084097  3.226911
2012-08-09 5.3903381 13.475845
2012-08-10 6.6127269 13.225454
2012-08-11 5.2863823  8.590371
2012-08-12 5.6620264  7.549369
2012-08-13 0.6178627  0.679649

理想情况下,解决方案应该在index(x)!=index(y) 时起作用

旁白: 我想出了这个技巧:

 z = xts( apply(x,2,function(col) col*y ) , index(x) )

它适用于测试数据,但在我的真实数据上它抱怨 Error in array(ans, c(len.a%/%d2, d.ans), if (!all(vapply(dn) .ans, is.null, : 'dimnames' [1] 的长度不等于数组范围 (我还没有设法在一小段测试数据中重现这一点。)

Joshua 和 DWin 的答案不存在这个问题,因此不仅在简洁性上而且在结果质量上都优越!

【问题讨论】:

    标签: r xts


    【解决方案1】:

    如果您只是删除单列 xts 对象的尺寸,它应该可以工作。然后R的回收规则可以接管。这比DWin's solution 稍微好一点,因为如果index(x) != index(y) 它将正常工作。

    R> (z <- x*drop(y))
                       a         b
    2012-08-03 0.2655087  5.310173
    2012-08-04 0.7442478  7.070354
    2012-08-05 1.7185601 10.311361
    2012-08-06 3.6328312 15.439532
    2012-08-07 1.0084097  3.226911
    2012-08-08 5.3903381 13.475845
    2012-08-09 6.6127269 13.225454
    2012-08-10 5.2863823  8.590371
    2012-08-11 5.6620264  7.549369
    2012-08-12 0.6178627  0.679649
    R> (z1 <- x*drop(y[1:5]))
                       a         b
    2012-08-03 0.2655087  5.310173
    2012-08-04 0.7442478  7.070354
    2012-08-05 1.7185601 10.311361
    2012-08-06 3.6328312 15.439532
    2012-08-07 1.0084097  3.226911
    

    【讨论】:

      【解决方案2】:

      不像JoshuaUlrich's answer那么圆滑,但是为了展示一些不同的东西,你可以使用sweep

      sweep(x, 1, y, "*")
      #                   a         b
      #2012-08-04 0.2655087  5.310173
      #2012-08-05 0.7442478  7.070354
      #2012-08-06 1.7185601 10.311361
      #2012-08-07 3.6328312 15.439532
      #2012-08-08 1.0084097  3.226911
      #2012-08-09 5.3903381 13.475845
      #2012-08-10 6.6127269 13.225454
      #2012-08-11 5.2863823  8.590371
      #2012-08-12 5.6620264  7.549369
      #2012-08-13 0.6178627  0.679649
      

      【讨论】:

      • 感谢并确认这也适用于真实数据(即,即使 apply 不起作用,原因我还不明白)。当index(y) 是index(x) 的一个子集时,Joshua 的答案是逻辑与,而这个答案给出了错误,并且 DWin 的向量方法使用了回收规则。 (即,每种技术都可能是不同应用程序的首选技术。)
      【解决方案3】:

      把y对象变成一个普通的向量:

      > z <-  x * c(coredata(y))
      > z
                            a             b
      2012-08-03 0.2655086631  5.3101732628
      2012-08-04 0.7442477993  7.0703540931
      2012-08-05 1.7185600901 10.3113605403
      2012-08-06 3.6328311600 15.4395324299
      2012-08-07 1.0084096552  3.2269108966
      2012-08-08 5.3903381098 13.4758452745
      2012-08-09 6.6127268802 13.2254537605
      2012-08-10 5.2863823399  8.5903713023
      2012-08-11 5.6620263951  7.5493685268
      2012-08-12 0.6178627047  0.6796489751
      

      【讨论】:

        猜你喜欢
        • 2020-11-15
        • 1970-01-01
        • 2021-02-24
        • 2018-06-15
        • 2019-09-02
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        相关资源
        最近更新 更多