在R中将数据帧转换为TS对象

在R中将数据帧转换为TS对象,r,holtwinters,R,Holtwinters,我有一个如下所示的数据帧: DAY X1996 X1997 1 1-Jul 98 86 2 2-Jul 97 90 3 3-Jul 97 93 .... 我希望最终得到一个TS对象,这样我就可以在上面进行Holtwiners平滑。我想我希望它看起来像这样(虽然我不确定,因为我以前没有做过Holtwiners): 这就是我想做的: df <- read.delim("temps.txt") myts <- as.ts

我有一个如下所示的数据帧:

  DAY     X1996 X1997 
1 1-Jul    98    86   
2 2-Jul    97    90   
3 3-Jul    97    93   
....
我希望最终得到一个TS对象,这样我就可以在上面进行Holtwiners平滑。我想我希望它看起来像这样(虽然我不确定,因为我以前没有做过Holtwiners):

这就是我想做的:

df <- read.delim("temps.txt")
myts <- as.ts(df)

dfts对象通常用于月度、季度或年度数据,而不是每日数据;但是,如果我们删除2月29日,那么我们可以创建一个ts对象,其时间为一年加上分数0/365、1/365、…、364/365,如果没有丢失的日期,该分数将按规则间隔。关键的一点是,如果季节性是基于一年,那么我们必须在每年有相同数量的点来表示它作为ts对象

首先转换为具有普通日期的zoo对象z0,删除2月29日给出的z,在zoo对象zz中创建上述时间索引,然后将其转换为ts

library(data.table)
library(lubridate)
library(zoo)

m <- melt(as.data.table(df), id.vars = 1)
z0 <- with(m, zoo(value, as.Date(paste(variable, DAY), "X%Y %d-%b")))
z <- z0[! (month(time(z)) == 2 & day(time(z)) == 29)]  

tt <- time(z)
zz <- zoo(coredata(z), year(tt) + (yday(tt) - ((month(tt) > 2) & leap_year(tt)) - 1)/365)
as.ts(zz)
库(data.table)
图书馆(lubridate)
图书馆(动物园)

m
tidyr::pivot_longer(df,cols=-DAY)
应该提供您所显示的格式@RonakShah非常接近。它是按天进行分组的,所以我的前几行是1996年7月1日、1997年7月1日、1998年7月1日等等,但这是朝着正确方向的一个很好的推动。我将在pivot_上查找更多的文档,看看我是否能找到它。好吧,您可以
年份排列
,以获得按年份排序的数据<代码>第三天::透视时间更长(df,cols=-天)%>%排列(年)
library(data.table)
library(lubridate)
library(zoo)

m <- melt(as.data.table(df), id.vars = 1)
z0 <- with(m, zoo(value, as.Date(paste(variable, DAY), "X%Y %d-%b")))
z <- z0[! (month(time(z)) == 2 & day(time(z)) == 29)]  

tt <- time(z)
zz <- zoo(coredata(z), year(tt) + (yday(tt) - ((month(tt) > 2) & leap_year(tt)) - 1)/365)
as.ts(zz)
zz0 <- z0[yday(time(z0)) <= 365]
tt <- time(zz0)
zz <- zoo(coredata(zz0), year(tt) + (yday(tt) - 1) / 365)
as.ts(zz)
ag <- aggregate(z0, as.yearmon, tail, 1)  # use last point in each month
as.ts(ag)
df <- structure(list(DAY = structure(1:3, .Label = c("1-Jul", "2-Jul", 
"3-Jul"), class = "factor"), X1996 = c(98L, 97L, 97L), X1997 = c(86L, 
90L, 93L)), class = "data.frame", row.names = c("1", "2", "3"
))