含多类型数据的xts对象无法plot.xts绘图及运算问题咨询
问题拆解:为什么包含Date列的xts对象无法正常绘图和运算?
这是个很容易踩的xts使用坑,我来帮你把问题拆解清楚:
一、testXTS1和testXTS2的核心差异
你可以用str()函数查看两个对象的内部结构,就能一眼看出区别:
str(testXTS1) # An ‘xts’ object on 2014-12-31/2015-01-04 containing: # Data: chr [1:3, 1:3] "2014-12-31" "2015-01-03" "2015-01-04" "1" "2" "3" "1" "3" "5" # Indexed by objects of class: [Date] TZ: UTC # xts Attributes: # NULL str(testXTS2) # An ‘xts’ object on 2014-12-31/2015-01-04 containing: # Data: num [1:3, 1:2] 1 2 3 1 3 5 # Indexed by objects of class: [Date] TZ: UTC # xts Attributes: # NULL
- testXTS1:因为你把
Date列(Date类型)和数值列一起放进了xts,xts基于zoo实现,而zoo要求所有数据列必须是同一数据类型。由于Date和数值无法统一为数值型,所以整个数据被强制转换成了字符型(chr)。 - testXTS2:只包含数值列,所以xts对象的数据类型是数值型(num),完全符合xts的设计要求。
二、为什么testXTS1看似是xts却不能正常使用?
虽然class(testXTS1$A)显示它是xts/zoo类,但它的底层数据是字符型,这就导致了两个问题:
- plot.xts报错:
plot.xts要求输入的是数值型时间序列,字符型的xts对象不满足这个要求,所以抛出'x' must be a time-series object的错误(这里的错误提示有点误导,实际是数据类型不对)。 - 数值运算报错:
+等二元运算符需要数值型参数,字符型无法参与运算,所以会提示non-numeric argument to binary operator。
三、解决方法
方法1:创建xts时排除Date列(推荐)
xts已经通过order.by参数指定了时间索引,完全不需要把Date列再作为数据列存在,直接用数值列创建即可:
testDate <- as.Date(c("2014-12-31","2015-01-03","2015-01-04")) testFrame1 <- data.frame(Date=testDate, A=c(1,2,3), B=c(1,3,5)) # 排除Date列后创建xts testXTS1_fixed <- as.xts(testFrame1[, !names(testFrame1) %in% "Date"], order.by=testDate) # 验证:正常绘图和运算 plot.xts(testXTS1_fixed$A) testXTS1_fixed$A + testXTS1_fixed$B
方法2:将已有的testXTS1列转换为数值型
如果你已经创建了包含字符型列的xts,可以手动把需要运算/绘图的列转成数值型:
testXTS1$A <- as.numeric(testXTS1$A) testXTS1$B <- as.numeric(testXTS1$B) # 现在可以正常使用 plot.xts(testXTS1$A) testXTS1$A + testXTS1$B
内容的提问来源于stack exchange,提问作者Plsdontjudgeme111
相关产品推荐
相关产品推荐

