【问题标题】:How to subtract an XTS-vector from each value of a large XTS-object where the index matches?如何从索引匹配的大型 XTS 对象的每个值中减去 XTS 向量?
【发布时间】:2019-12-31 12:10:29
【问题描述】:

我必须在 R 中使用两个 XTS 对象,一个大对象 A 和一个单列对象 B,其结构如下:

| Object A | V1 | V2 | ...        | Object B | V1 |
---------------------------       -----------------
|2016-01-01| 1  | 6  | ...        |2016-01-01| 4  |
|2016-01-02| 2  | 7  | ...        |2016-01-02| 8  |
|2016-01-03| 3  | 8  | ...        |2016-01-03|10  |
|2016-01-04| 4  | 9  | ...        |2016-01-04|-3  |
|2016-01-05| 5  | 10 | ...        |2016-01-05| 6  |
|   ...    | .. | .. | ...        |    ...   | .. |

我想从A 的任意列中减去B 的值,得到:

| Object C | V1 | V2 | ...
---------------------------
|2016-01-01|-3  | 2  | ...
|2016-01-02|-6  |-1  | ...
|2016-01-03|-7  |-2  | ...
|2016-01-04| 7  |12  | ...
|2016-01-05|-1  | 4  | ...
|   ...    | .. | .. | ...

由于两个对象的列数不匹配,简单的减法就会导致错误non-conformable arrays

set.seed(1234)

# set up date structure
dates <- seq(as.Date("2016-01-01"), length = 5, by = "days")

# create object A and B
A <- xts(x = matrix(seq(1:10), ncol = 2), order.by = dates)
B <- xts(x = rnorm(5), order.by = dates)

A-B
Error in `-.default`(A, B) : non-conformable arrays

问题:

如何从日期匹配的大型 XTS 对象(即A)的每个值中减去每次的单个值(即B)?

【问题讨论】:

    标签: r xts


    【解决方案1】:

    如果您想在日期匹配的地方进行计算,最好使用 xts 对象进行合并。然后您可以使用列计算,但请确保将 NA 替换为 0。我在下面创建了一个可重现的示例,其中 xts B 与 A 相比缺少日期。

    library(xts)
    
    set.seed(1234)
    
    # set up date structure
    dates <- seq(as.Date("2016-01-01"), length = 5, by = "days")
    
    # create object A and B
    A <- xts(x = matrix(seq(1:10), ncol = 2), order.by = dates)
    # B is has 1 date less than A
    B <- xts(x = rnorm(4), order.by = dates[c(1:2, 4:5)]) 
    
    # name the xts columns 
    names(A) <- paste0("A", 1:ncol(A))
    names(B) <- "B"
    
    # merge data on date
    x <- merge(A,B)
    
    # set NA values in column "B" to 0
    x[, "B"] <- na.fill(x[, "B"], 0)
    
    # substract B from all A columns
    for (i in names(A)) {
      x[, i] <- x[, i] - x[, "B"]
    }
    
    # drop column "B"
    z <- x[, names(A)]
    z
                       A1        A2
    2016-01-01  1.8371717  6.837172
    2016-01-02 -0.4158352  4.584165
    2016-01-03  3.0000000  8.000000
    2016-01-04  3.8659118  8.865912
    2016-01-05  5.4906859 10.490686
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2013-12-30
      • 2012-08-15
      相关资源
      最近更新 更多