R调用chart.TimeSeries绘图报条件长度>1错误排查
问题根因
- 首个报错
Error in if (class(x) == "numeric") { : the condition has length > 1触发逻辑明确:你传入chart.TimeSeries的是tibble(tbl_df)类型对象,R取该对象的class时会返回长度为3的向量c("tbl_df", "tbl", "data.frame"),和字符串"numeric"做相等判断后得到长度为3的逻辑值向量,而if语句仅接受单个TRUE/FALSE判断值,因此直接报错。 - 你之前尝试的两种排查方案都存在逻辑错误:
- 单独将日期列转为
ts对象完全无效:ts是基于数值存储的等间隔时间序列类,既不能被chart.TimeSeries识别为时间索引,你也没有把日期列从数据列中剥离,函数无法区分哪一列是时间轴、哪一列是要绘图的指标。 - xts转换报错
order.by requires an appropriate time-based object有两个诱因:一是你把日期列本身也作为数据列传入了xts构造函数的x参数(xts要求x必须是纯数值型数据);二是如果你提前把日期列转为ts对象,它就不再是xts支持的Date/POSIXct/yearmon类合法时间类型,自然无法作为order.by参数传入。
- 单独将日期列转为
解决方案
chart.TimeSeries原生对xts格式时间序列适配最好,不需要额外指定索引参数,按如下步骤处理即可正常绘图:
- 除PerformanceAnalytics外,额外加载xts包用于时间序列构造
- 构造xts对象时,数据部分仅传入数值型的波动率列,不要混入日期列,用未做其他转换的Date格式日期列作为order.by时间索引
- 直接传入构造完成的xts对象调用绘图函数即可
可直接运行的修正代码
# 加载依赖包 library(PerformanceAnalytics) library(xts) vola <- structure(list(date_2 = c("2012-02-10", "2012-02-17", "2012-02-24", "2012-03-02"), volaEUROSTOXX = c(0.298444539308548, 0.318111568689346, 0.300136715173721, 0.299697518348694), volaKENYA25 = c(0.00786208733916283, 0.157017216086388, 0.0838639214634895, 0.152377054095268), volaNAM = c(0.120841704308987, 0.336489349603653, 0.116947680711746, 0.157027021050453), volaNIGERIA = c(0.102476172149181, 0.225841268897057, 0.163881614804268, 0.317349642515182), volaSA = c(0.167590111494064, 0.226006388664246, 0.103997424244881, 0.193037077784538), date = structure(c(1328832000, 1329436800, 1330041600, 1330646400), tzone = "UTC", class = c("POSIXct", "POSIXt"))), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) # 基础数据清洗 vola <- subset(vola, select = -c(date)) vola$date_2 <- as.Date(vola$date_2) # 正确构造xts对象 vol.xts <- xts( x = vola[, colnames(vola) != "date_2"], # 仅保留数值型波动率列作为绘图数据 order.by = vola$date_2 # 用标准Date格式列作为时间索引 ) # 调用绘图函数,无报错 chart.TimeSeries( vol.xts, lwd=2, auto.grid=F, ylab="Annualized Log Volatility", xlab="Time", main="Log Volatility", lty=1, legend.loc="topright" )
如果不想转换xts格式,也可以先把tibble转为普通data.frame,剥离日期列后再传入绘图函数:
vola_df <- as.data.frame(vola) chart.TimeSeries( vola_df[, -1], lwd=2, auto.grid=F, ylab="Annualized Log Volatility", xlab="Time", main="Log Volatility", lty=1, legend.loc="topright" )
内容的提问来源于stack exchange,提问作者jugross
相关产品推荐
相关产品推荐

