R 将时间序列转换为数据帧并返回

R 将时间序列转换为数据帧并返回,r,dataframe,time-series,R,Dataframe,Time Series,时间序列的输出看起来像一个数据帧: ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12) Jan Feb Mar Apr May Jun Jul ... 1981 14.064085 21.664250 14.800249 -5.773095 16.477470 1.129674 16.747669 ... 1982 23.973620 17

时间序列的输出看起来像一个数据帧:

ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

       Jan       Feb       Mar       Apr       May       Jun       Jul     ...
1981 14.064085 21.664250 14.800249 -5.773095 16.477470  1.129674 16.747669 ...
1982 23.973620 17.851890 21.387944 28.451552 24.177141 25.212271 19.123179 ...
1983 19.801210 11.523906  8.103132  9.382778  4.614325 21.751529  9.540851 ...
1984 15.394517 21.021790 23.115453 12.685093 -2.209352 28.318686 10.159940 ...
1985 20.708447 13.095117 32.815273  9.393895 19.551045 24.847337 18.703991 ...
df <- data.frame(AirPassengers, year = trunc(time(AirPassengers)), 
month = month.abb[cycle(AirPassengers)])

将其转换为包含列Jan、Feb、Mar的数据帧将非常方便。。。和1981年,1982年。。。然后回来。最优雅的方法是什么?

这里有两种方法。第一种方法是为即将创建的矩阵创建dimname,然后将数据串成矩阵,将其转置并转换为数据帧。第二种方法创建一个由年和月变量组成的by列表,并在该列表上使用tapply,然后将其转换为数据框并添加名称

# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
2)t轻轻地。使用
tapply
的更通用解决方案如下:

Month <-  factor(cycle(tt), levels = 1:12, labels = month.abb)
tapply(tt, list(year = floor(time(tt)), month = Month), c)
更新
以下@latemail的评论推动了改进。

AirPassenger数据集示例:

使数据可用并检查其类型:

data(AirPassengers)
class(AirPassengers)
将时间序列转换为数据帧:

ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

       Jan       Feb       Mar       Apr       May       Jun       Jul     ...
1981 14.064085 21.664250 14.800249 -5.773095 16.477470  1.129674 16.747669 ...
1982 23.973620 17.851890 21.387944 28.451552 24.177141 25.212271 19.123179 ...
1983 19.801210 11.523906  8.103132  9.382778  4.614325 21.751529  9.540851 ...
1984 15.394517 21.021790 23.115453 12.685093 -2.209352 28.318686 10.159940 ...
1985 20.708447 13.095117 32.815273  9.393895 19.551045 24.847337 18.703991 ...
df <- data.frame(AirPassengers, year = trunc(time(AirPassengers)), 
month = month.abb[cycle(AirPassengers)])
绘制结果以确保正确执行:

components.ts = decompose(tsData)
plot(components.ts)
试试“tsbox”软件包

ts=ts(rnorm(12*5,17,8),start=c(1981,1),frequency=12)
df=ts_df(ts)
str(df)

data.frame:60obs。共有2个变量:
时间:日期,格式:“1981-01-01”“1981-02-01”

value:num 23.15 22.77 5.1 1.05 13.87

我需要它来制作boxplot()本赛季,今天我玩的是ggplot,它需要另一种格式,它不像plot系列那样知道你通常想要从数据中得到什么。我觉得您使用的当前数据格式总是会影响您。转换感觉笨拙或肮脏,见Grothendieck mingeling先生与month.abb等。还没有人想到制作转换库?as.data.frame(ts)、as.qplot(ts,geom=“boxplot”)等。。?其他人也和我一样感到痛苦吗?可以使用
boxplot(tt~cycle(tt))
进行箱线图绘制,其中
tt
是您的
“ts”
系列。zoo软件包确实具有特定于时间序列的绘图。请参见该软件包中的
?plot.zoo
?xyplot.zoo
data.frame(矩阵(co2,ncol=frequency(co2),dimnames=dimnames(.preformat.ts(co2))
了解另一种尝试,只需重复问题后的更新注释-第二个
tapply()
如果
ts
不能很好地拟合矩形,则解决方案比矩阵更可取-
tt唯一的缺点是数据框内的变量(如年份)仍然是时间序列。谢谢,这很有帮助!
tsData = ts(df$AirPassengers, start = c(1949,1), end = c(1960,12), frequency = 12)
components.ts = decompose(tsData)
plot(components.ts)