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

时间:2017-01-16 06:37:07

标签: r xts

我在xts中设置了一个“决策图”。以下代码的结果生成如下:

              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个decicion列。有没有办法让“Master.dec”中的计算完好无损且工作正常,尽管决策栏中不会有1到3个?

重现我遇到的问题:

1)运行完整的脚本

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

3)只运行脚本的第2部分(2.添加规则系统) ......你会收到错误:

NextMethod(.Generic)中的错误:   dims [product 3]与object [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)

1 个答案:

答案 0 :(得分:1)

由于xts对象基本上只是一个索引matrix,因此您可以尝试计算行方式标准差。如果结果为0(即所有值都相同),则您可以将rowMin(或max(根据您的喜好)分配给新列,否则{{1} }。

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

matrixStats