我在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)
答案 0 :(得分:1)
由于xts
对象基本上只是一个索引matrix
,因此您可以尝试计算行方式标准差。如果结果为0
(即所有值都相同),则您可以将rowMin
(或max
(根据您的喜好)分配给新列,否则{{1} }。
使用0
包可以找到一个高效简洁的解决方案:
matrixStats