如何通过添加时间属性将简单时间序列对象转换为维度2,以便可以使用字符串?
在这个question中,引用时间序列的方法是使用colnames,建议的方法是将其转换为zoo对象。在单个时间序列的情况下,如果我做名字(tseries),它给出NULL。因此,为了分配名称,尝试使用只能在维度2的对象中使用的colnames,并通过添加日期索引来构造。在这里,我尝试使用列表对象中已有的时间属性,这样我就不必在动物园对象中来回转换。
如果有替代方案,我会很高兴知道这一点。目的是能够在图表等的标题中使用时间序列的名称。
要重新提出问题,如何为时间序列命名?在此处的许多问题中使用应用条带时间序列属性。然后返回时间属性和名称,并以允许使用colnames的格式,有什么方法?我从系列和一列日期开始,允许命名系列但是从lapply(tslist,函数)返回的矢量格式,我需要重新分配名称。如果有更简单的方法,请告诉我,因为这是主要问题。
一个有点相关的问题是link @Henrik的回答建议添加一个虚拟列,以避免将动物园对象强制转换为向量,以保持它的维度为2。
在我们有一个带有所需时间信息的列表对象的特定情况下,我遵循了这个方法。
使用HP过滤器查找循环时,我执行以下操作
x <-ts(rnorm(100), start = c(1990, 1), frequency = 12)
library(mFilter)
hp <- hpfilter(x, 1600)
c1 <- hp$cycle
str(c1)
#Time-Series [1:100] from 1990 to 1998: 1.852 -0.368 -0.942 -0.756 1.006 ...
str(hp) # shows that it has the attributes of time series and tsp etc.
子集化的主要对象的Str
List of 10
$ cycle : Time-Series [1:100] from 1990 to 1998: 1.852 -0.368 -0.942 -0.756 1.006 ...
$ trend : ts [1:100, 1] -0.191 -0.193 -0.193 -0.191 -0.187 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "Series 1"
..- attr(*, "tsp")= num [1:3] 1990 1998 12
$ fmatrix: num [1:100, 1:100] 0.799 -0.178 -0.156 -0.135 -0.116 ...
$ title : chr "Hodrick-Prescott Filter"
$ xname : chr "x"
$ call : language hpfilter(x = x, freq = 1600)
$ type : chr "lambda"
$ lambda : num 1600
$ method : chr "hpfilter"
$ x : ts [1:100, 1] 1.661 -0.561 -1.135 -0.947 0.819 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "Series 1"
..- attr(*, "tsp")= num [1:3] 1990 1998 12
- attr(*, "class")= chr "mFilter"
c1是维度1的对象,因为当我尝试为其指定名称时,
colnames(c1) <- "x"
发出此错误
Error in `colnames<-`(`*tmp*`, value = "iip") :
attempt to set 'colnames' on an object with less than two dimensions
为了帮助使用时间序列的名称,我们可以通过添加索引将c1转换为zoo对象,或者将cbind与日期列相关联。
由于名称和时间属性信息存在于我们进行子集化的起始对象中,是否有办法使用它来提取具有时间属性的组件?
提取的系列必须具有类似于列表对象
中输入系列的结构ts [1:100, 1] 1.661 -0.561 -1.135 -0.947 0.819 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "Series 1"
..- attr(*, "tsp")= num [1:3] 1990 1998 12
我认为可以作为
访问attributes(c1) <- attributes(hp$x)
colnames(c1) <- "X1" # is now possible.
如何返回hp $循环及其属性?
如何在分配colnames时访问chr“Series 1”?
colnames(c1)
# Series 1
## Return hp$cycle along with the time attributes so that str(h1) is as follows
h1 <- hp$cycle
str(h1)
# this gives
Time-Series [1:100] from 1990 to 1998: 1.852 -0.368 -0.942 -0.756 1.006 ..
#I want it to be of this form
ts [1:100, 1] 1.661 -0.561 -1.135 -0.947 0.819 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "Series 1"
..- attr(*, "tsp")= num [1:3] 1990 1998 12
非常感谢。
这些是我用来从一个系列中提取时间属性并添加到另一个系列的替代方案。
使用tsp: 这导致错误或维度不匹配
tsp(h1)&lt; - tsp(x)
在tsp中使用开始,结束,频率信息 由于月度数据的tsp是分数,因此不知道如何获得起始月份信息 即将1970.250转换为1970年,4说,(不知道哪个是起始月份) 然后我可以做类似
的事情h1.ts&lt; - ts(h1,start = c(tsp 1,n),frequency = tsp [3])
答案 0 :(得分:2)
根据提供的信息,我猜您可以尝试:
h1 <- hp$cycle
str(h1)
#Time-Series [1:100] from 1990 to 1998: -0.516 1.101 -0.756 0.786 0.926 ...
attributes(h1)
#$tsp
#[1] 1990.00 1998.25 12.00
#$class
#[1] "ts"
如果查看str(hp)
,它是10个元素的列表。要访问不同元素的属性,您可以使用attributes
或attr
。例如:
attr(hp$cycle, "tsp")
#[1] 1990.00 1998.25 12.00
或者
attributes(hp$cycle)[["tsp"]] #
#[1] 1990.00 1998.25 12.00
获取列表元素的整个attributes
attributes(hp$cycle)
#$tsp
#[1] 1990.00 1998.25 12.00
#$class
#[1] "ts"
使用c
连接不同列表元素的属性并保留列表结构
attributes(h1) <- c(attributes(hp$cycle), attributes(hp$trend))
str(h1)
#ts [1:100, 1] -0.516 1.101 -0.756 0.786 0.926 ...
#- attr(*, "tsp")= num [1:3] 1990 1998 12
#- attr(*, "dimnames")=List of 2
# ..$ : NULL
#..$ : chr "Series 1"
tsp(h1)
#[1] 1990.00 1998.25 12.00
tsp(h1) <- tsp(x) #no errors here
答案 1 :(得分:1)
您可以使用start
,end
和time
:
start(c1)
[1] 1990 1
end(c1)
[1] 1998 4
time(c1)
Jan Feb Mar Apr May Jun Jul Aug
1990 1990.000 1990.083 1990.167 1990.250 1990.333 1990.417 1990.500 1990.583
1991 1991.000 1991.083 1991.167 1991.250 1991.333 1991.417 1991.500 1991.583
1992 1992.000 1992.083 1992.167 1992.250 1992.333 1992.417 1992.500 1992.583
1993 1993.000 1993.083 1993.167 1993.250 1993.333 1993.417 1993.500 1993.583
1994 1994.000 1994.083 1994.167 1994.250 1994.333 1994.417 1994.500 1994.583
1995 1995.000 1995.083 1995.167 1995.250 1995.333 1995.417 1995.500 1995.583
1996 1996.000 1996.083 1996.167 1996.250 1996.333 1996.417 1996.500 1996.583
1997 1997.000 1997.083 1997.167 1997.250 1997.333 1997.417 1997.500 1997.583
1998 1998.000 1998.083 1998.167 1998.250
Sep Oct Nov Dec
1990 1990.667 1990.750 1990.833 1990.917
1991 1991.667 1991.750 1991.833 1991.917
1992 1992.667 1992.750 1992.833 1992.917
1993 1993.667 1993.750 1993.833 1993.917
1994 1994.667 1994.750 1994.833 1994.917
1995 1995.667 1995.750 1995.833 1995.917
1996 1996.667 1996.750 1996.833 1996.917
1997 1997.667 1997.750 1997.833 1997.917
1998
答案 2 :(得分:1)
如果问题是如何创建一个带有名称的n x 1个月ts
系列,那么:
xx <- ts(cbind(A = 1:5), start = c(2000, 1), freq = 12)
我们现在可以通过名称来引用它:
xx[, "A"]
我们可以提取这样的各种组件:
xx[2] # second point
xx[2, 1] # second point with name
xx[2, "A"] # same
start(xx) # start time
time(xx)[1]
end(xx) # end time
time(xx)[NROW(xx)]
time(xx) # times
c(time(xx))
frequency(xx)
cycle(xx) # months as a ts series
c(cycle(xx)) # plain
floor(time(xx)) # years as a ts series
c(floor(time(xx)))
我们可以将下面的yy
转换为名称为
yy <- ts(1:5, start = c(2000, 1), frequency = 12)
dim(yy) <- c(length(yy), 1)
colnames(yy) <- "A"
yy[2, 1] # get second point with name
已添加如果我们有:
xx <- ts(cbind(A = 1:5), start = c(2000, 1), freq = 12)
和属性被剥离:
xx2 <- c(xx)
然后我们可以这样做:
xx[] <- xx2
答案 3 :(得分:0)
我不确定所需的输出是什么。希望这可以帮助。请显示所需的输出。
newdf<-as.data.frame(hp$x)
colnames(newdf)
[1] "Series 1"