假设我有三个xts对象a
,m
,s
,使用相同的时间段编制索引,我想计算abs((a*20)-m)/s
。这适用于以下简单情况:
bla <- data.frame(c("2016-09-03 13:00", "2016-09-03 13:10", "2016-09-03 13:20"),c(1,2,3), c(4,5,6), c(7,8,9))
names(bla) <- c('ts','lin','qua','cub')
a <- as.xts(x = bla[,c('lin','qua','cub')], order.by=as.POSIXct(bla$ts)
... similar for m and s...
abs((a*20)-m)/s
给出正确的结果。
当我查看我的真实数据时,我看到了不同的行为:
> class(a)
[1] "xts" "zoo"
> class(m)
[1] "xts" "zoo"
> class(s)
[1] "xts" "zoo"
> dim(a)
[1] 1 4650
> dim(m)
[1] 1 4650
> dim(s)
[1] 1 4650
列名也是相同的:
> setdiff(names(a),names(m))
character(0)
> setdiff(names(m),names(s))
character(0)
现在当我n <- abs((a*20)-m)/s
时,我得到了
> n[1,feature]
feature
2016-09-08 14:00:00 12687075516
但如果我手工计算:
> aa <- coredata((a*20)[1,feature])[1,1]
> mm <- coredata(m[1,feature])[1,1]
> ss <- coredata(s[1,feature])[1,1]
> abs(aa-mm)/ss
feature
0.0005893713
只是给出原始值:
> a[1,feature]
feature
2016-09-08 14:00:00 27955015680
> m[1,feature]
feature
2016-09-08 14:00:00 559150430034
> s[1,feature]
feature
2016-09-08 14:00:00 85033719103
任何人都可以解释这种差异吗?
非常感谢
诺贝特
答案 0 :(得分:0)
自我回答:错误是我认为xts在a/b
考虑列名称的意义上更加智能,而不。
> a
lin qua cub
2016-09-03 13:00:00 1 4 7
2016-09-03 13:10:00 2 5 8
2016-09-03 13:20:00 3 6 9
> b
qua lin cub
2016-09-03 13:00:00 2 3 4
2016-09-03 13:10:00 2 3 4
2016-09-03 13:20:00 2 3 4
> a/b
lin qua cub
2016-09-03 13:00:00 0.5 1.333333 1.75
2016-09-03 13:10:00 1.0 1.666667 2.00
2016-09-03 13:20:00 1.5 2.000000 2.25
除法通过基础矩阵完成,而不考虑列名。这就是为什么即使列名称集重合,结果也是错误的。