如何命名时间序列对象中的列?
Posted
技术标签:
【中文标题】如何命名时间序列对象中的列?【英文标题】:How to name columns in time series objects? 【发布时间】:2012-10-28 01:19:25 【问题描述】:我在这里有点困惑,一定缺少一些非常基本的东西。 我想从多个时间序列对象中提取列。也许可以通过将 ts 对象放入数据框然后提取它们来完成,但是有一种直接的方法可以对时间序列进行子集化,如这个问题link
要弄清楚如何为 ts 对象分配名称,?ts 显示
ts(data = NA, start = 1, end = numeric(), frequency = 1,
deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )
但是在 ?ts 帮助中运行代码时,有或没有 names 参数给出
names(z)
NULL。
z <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), frequency=12)
或z <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), frequency=12, names=c("x1", "x2", "x3"))
主要问题:1.如何为时间序列对象 ts 和 mts 中的列分配名称? 2. 随时间索引直接从时间序列对象中提取列的方法有哪些?是否有必要将其转换为 zoo 或 xts 类?还是单独添加时间索引?
为了说明我要解决的问题:
# using inbuilt ldeaths time series dataset
ldeaths
d <- diff(ldeaths)
percen <- quantile(d, 0.9)
i <- ifelse(d>percen, 1,0)
signal <- cbind(d,i)
现在提取指标为 1 的数据集,带有时间索引, 我不确定如何进行。 str(signal) 是一个 mts 对象,但打印信号显示没有时间索引。
非常感谢。
【问题讨论】:
关于为什么打印信号没有在数据旁边提供时间信息的任何想法,尽管它是一个 mts 对象? 确实如此,您认为打印对象上的rownames
是什么!?这是"ts"
对象的标准行为。 "ts" object
obj` 的 tsp(obj)
仅在数据不是年度、季度或月度时才会显式打印。在这三种特殊情况下,print.ts
方法更喜欢更紧凑的布局,有些人认为它更有用。假设这就是您的意思,您始终可以从 tsp(signal)
获取时间信息。
【参考方案1】:
提取"mts"
对象中的系列名称
你想要colnames()
:
> colnames(z)
[1] "x1" "x2" "x3"
这是因为z
实际上是一个带有额外属性的矩阵,而矩阵没有names
,但它们确实有colnames
。
在"mts"
对象中分配/更改系列的名称
要在事后分配colnames
或更改它们,请使用替换功能'colnames<-'
> colnames(z) <- paste0("a", 1:3)
> colnames(z)
[1] "a1" "a2" "a3"
从"mts"
对象中提取特定系列
至于提取列,[
适用于 "ts"
和 "mts"
对象。例如:
> z[,1]
Jan Feb Mar Apr May
1961 0.81800833 -0.30852155 0.05915071 0.14937058 0.67734362
1962 1.12993606 -0.81176485 -0.51903387 1.12527537 -0.34377553
1963 1.30469813 0.32486340 0.01029512 -1.13631688 -1.22013150
1964 0.72449621 -0.88704234 0.78834391 -0.92956537 -0.31584252
1965 0.24610412 0.97980266 0.17136276 2.45216318 0.15846038
1966 -0.48891587 -0.62820331 0.33190472 2.14094813 1.32389152
1967 0.49120472 -0.10149521 -0.39070688 -0.78743955 -1.20563040
1968 -0.70749150 0.52333087 -0.51991721 0.02037504 -0.59848254
1969 -0.80156968 -1.38172513 0.09400527 0.66966443
....
OP 问题的核心
最后一点,我不确定你希望得到什么。 "ts"
或 "mts"
对象是常规时间序列,提取 signal[, "d"]
的位会产生向量而不是时间序列。
> signal[signal[,2] == 1, 1]
[1] 761 1104 810 653 522 956 593
没有任何时间索引,因为这不再是 "ts"
对象。如果你想这样做,zoo 包可能是你想要的方式。这是一个例子,我们使用as.zoo()
转换为动物园对象
require(zoo)
sz <- as.zoo(signal)
然后我们可以提取我们想要的观察结果(名称是时间索引的有用指标)
> sz[sz[, "i"] == 1, "d"]
1975(12) 1976(2) 1976(12) 1977(12) 1978(1) 1978(12) 1979(1)
761 1104 810 653 522 956 593
然后是类似的子集调用,但使用index()
返回整个动物园对象的时间索引,然后选择我们想要的位
> index(sz)[sz[, "i"] == 1]
[1] 1975.917 1976.083 1976.917 1977.917 1978.000 1978.917
[7] 1979.000
【讨论】:
感谢您的及时回复!我想提取值超过百分位数的日期。我尝试了其他将信号与数据组合的方法,例如合并以将其保留为 ts 对象。在 zoo 和 ts 和 dataframe 对象之间移动时会让人感到困惑,因此想知道是否有直接使用 ts 类的方法。 从你的例子来看,index(sz)
(来自我的答案)和tsp(signal)
(来自你的问题)看起来非常相似。不确定您的意思是从 动物园 方面混淆。
我正在尝试类似的子集设置方法,但它不起作用。弄清楚如何将数据作为动物园对象读入需要时间。之后,一些组合方法或分析会改变对象的属性,然后不清楚如何重新分配它,比如索引或属性。
有没有办法将 index(sz) 中给出的索引值解释为 1975.917, 1976.083,...
它们是频率的比例(1/12)。试试setNames((1:12) / 12, month.abb)
看看小数是什么意思。在我的回答中,names(sz[sz[, "i"] == 1, "d"])
包含 ()
中的月份,这也可以帮助您了解小数在月份方面的含义。【参考方案2】:
如果您想重命名 mts
(矩阵时间序列)对象的列。只需简单地使用colnames()
函数。
例如:您有一个包含三列的时间序列数据,并且您想更改该列名称:
colnames(data) <- c('newname1','newname2','newname3')
希望这会有所帮助。
【讨论】:
以上是关于如何命名时间序列对象中的列?的主要内容,如果未能解决你的问题,请参考以下文章