如何对xts时间序列集合进行索引?
问题解决:R中xts对象列表的索引与绘图错误
问题背景
我有一个名为data_ts的大型xts时间序列对象,直接执行plot(data_ts)或绘制有效范围内的子集plot(data_ts[t1:t2])都能正常运行。我习惯Python语法,于是用comprehenr包的to_list()实现列表推导,tidytidbits包的g(...) %=% c(...)实现类Python元组赋值,将5个时间序列子集存入列表:
data_csv <- read.csv("timeseries.csv", header=TRUE) segm_csv <- read.csv("ts_segments.csv", header=TRUE) data_ts <- xts(data_csv$Max.Pressure, order.by=as.POSIXct(data_csv$Datetime)) data_ts_idx <- index(data_ts) data_ts_segm <- to_list(for (i in 1:5) { g(m, n) %=% c(segm_csv[i,1], segm_csv[i,2]) g(t1,t2) %=% c(data_ts_idx[m], data_ts_idx[n]) print(str_interp("period segment ${i}: ${t1} - ${t2}", list(i=i,t1=t1,t2=t2))) data_ts[m:n] } )
但尝试绘制列表中的片段时出现错误:
> plot(data_ts_segm[1]) Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' is a list, but does not have components 'x' and 'y'
对比结构发现,data_ts_segm[1]是包含xts对象的列表,而直接子集的data_ts[1:n]是xts对象本身。
错误原因
R中列表的索引方式和Python有核心差异:
- 单括号
[]提取的是子列表,返回结果仍然是list类型,即使只取一个元素 - 双括号
[[]]才会提取列表中的单个元素本身,返回元素的原始类型(这里就是xts对象)
你用data_ts_segm[1]传入plot(),实际传入的是一个包含xts对象的列表,而非xts对象,因此触发错误。
解决方法
使用双括号索引提取列表中的xts对象,再传入绘图函数:
plot(data_ts_segm[[1]])
验证
对比两种索引的输出结构:
# 单括号返回子列表 str(data_ts_segm[1]) List of 1 $ :An ‘xts’ object on 2021-01-01 00:10:54/2021-01-22 02:59:07 containing: Data: num [1:618, 1] 75.5 71.9 73.5 73.8 73.8 ... Indexed by objects of class: [POSIXct,POSIXt] TZ: xts Attributes: NULL # 双括号返回xts对象本身 str(data_ts_segm[[1]]) An ‘xts’ object on 2021-01-01 00:10:54/2021-01-22 02:59:07 containing: Data: num [1:618, 1] 75.5 71.9 73.5 73.8 73.8 ... Indexed by objects of class: [POSIXct,POSIXt] TZ: xts Attributes: NULL
内容的提问来源于stack exchange,提问作者stustd
相关产品推荐
相关产品推荐

