xts - 保持列的计算完整,即使某些列可能丢失

xts - keep calculation of columns intact, even though some columns might be missing

我正在 xts 中设置 "decision-map"。以下代码的结果生成如下:

              dec.1 dec.2 dec.3 dec.4     Master.dec
2017-01-01      2     2     2    2          2
2017-02-02      3     3     3    3          3
2017-03-03      0     0     0    0          0

这些列中总会存在最少的一列 (dec.1 -> dec.4),但不知道它是 1、2、3 还是 4 列 (dec.1 -> dec. 4).

在最初的解决方案中,决策列将通过 xts-sheet 展开,因此我将无法使用列号作为标识符。

问题:

在"Master.dec"列中,我根据左侧的列(dec.1 - dec.4)进行计算,其中有时会是1、2、3或4个决策列。有没有一种方法可以使 "Master.dec" 中完成的计算保持完整和有效,尽管决策列中的 1 到 3 个不存在?

重现我遇到的问题:

1) 运行 完整脚本

2) 删除一列:xts1$dec.1 <- NULL

3) 运行 仅脚本的第 2 部分(2.add 规则系统) ...你会得到错误:

NextMethod(.Generic) 错误: dims [产品 3] 与对象 [0]

的长度不匹配

注意!解决方案应该能够删除 1-3 个决策列,总会有一个决策列,但不知道是哪些。

    # dependent libraries
library(matrixStats)
library(xts)
#############################################
# 1. Create the xts from a data.frame base
#############################################
# creates a dataframe
df1 <- data.frame(date = c("2017-01-01", "2017-02-02", "2017-03-03"), 
              other.1 = c(1998, 1999, 2000),
              dec.1 = c(2, 3, 0), 
              other.2 = c(58, 54, 32),
              other.3 = c(12, 3, 27),
              dec.2 = c(2, 3, 0),
              dec.3 = c(2, 3, 0),
              other.4 = c(2, 5, 27),
              dec.4 = c(2, 3, 0)
)

# transforms the column date to date-format
df1 = transform(df1,date=as.Date(as.character(date),format='%Y-%m-%d'))  
# creates the xts, based on the dataframe df1
xts1 <- xts(df1[,-1],order.by = df1$date)

#############################################
# 2.Add a rule system:
# if all "dec"-columns are 2, add value 2 in master.dec
# if all "dec"-columns are 3, add value 3 in master.dec
# if all "dec"-columns are 0, (or any other combination then above) add   value 0 in master.dec
#############################################
xts1$m.dec <- ifelse(rowSds(xts1)==0,rowMins(xts1),0)

由于 xts 对象本质上只是一个索引 matrix,您可以尝试计算行标准偏差。如果结果是 0(即所有值都相同),则将 rowMin(或 max,以您喜欢的为准)分配给新列,否则 0.

可以使用 matrixStats 包找到高效简洁的解决方案:

library(matrixStats)
xts1$m.dec <- ifelse(rowSds(xts1)==0,rowMins(xts1),0)
#           dec.1 dec.2 dec.3 dec.4 m.dec
#2017-01-01     2     2     2     2     2
#2017-02-02     3     3     3     3     3
#2017-03-03     0     0     0     0     0