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

Rol*_*ler 16 r time-series dataframe

时间序列的输出看起来像数据框:

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 ...
Run Code Online (Sandbox Code Playgroud)

将它转换为包含Jan,Feb,Mar ......和1981,1982行......的数据框将是很方便的.最优雅的方式是什么?

G. *_*eck 21

这有两种方式.第一种方法为即将创建的矩阵创建dimnames,然后将数据串行化为矩阵,转置它并将其转换为数据帧.第二种方法创建一个由年份和月份变量组成的by列表,并使用tapply,稍后转换为数据框并添加名称.

# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)
Run Code Online (Sandbox Code Playgroud)

1)矩阵.这个解决方案要求我们连续几年

dmn <- list(month.abb, unique(floor(time(tt))))
as.data.frame(t(matrix(tt, 12, dimnames = dmn)))
Run Code Online (Sandbox Code Playgroud)

如果我们不关心这个好名字那就是它as.data.frame(t(matrix(tt, 12))).

我们可以dmn<-使用@thelatemail的评论用以下更简单的行替换该行:

dmn <- dimnames(.preformat.ts(tt))
Run Code Online (Sandbox Code Playgroud)

2)tapply.使用的更通用的解决方案tapply如下:

Month <-  factor(cycle(tt), levels = 1:12, labels = month.abb)
tapply(tt, list(year = floor(time(tt)), month = Month), c)
Run Code Online (Sandbox Code Playgroud)

注意:要反转这个假设X是上面的任何解决方案.然后尝试:

ts(c(t(X)), start = 1981, freq = 12)
Run Code Online (Sandbox Code Playgroud)

更新

由以下@latemail评论推动的改进.