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
我正在 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