目的:一个时间序列对象转换为数据帧。
数据:datasets::Seatbelts
问题:这是一个有一个月和一年时间戳的时间序列对象。我想提取月份和年份在单独的列。看到:
> Seatbelts
DriversKilled drivers front rear kms PetrolPrice VanKilled law
Jan 1969 107 1687 867 269 9059 0.10297 12 0
Feb 1969 97 1508 825 265 7685 0.10236 6 0
Mar 1969 102 1507 806 319 9963 0.10206 12 0
Apr 1969 87 1385 814 407 10955 0.10087 8 0
May 1969 119 1632 991 454 11823 0.10102 10 0
Jun 1969 106 1511 945 427 12391 0.10058 13 0
Jul 1969 110 1559 1004 522 13460 0.10377 11 0
我已经阅读这篇文章:
Converting ts object to data.frame
与该解决方案的问题:
data.frame(as.matrix(seatbelts), date=time(seatbelts))
是,我得到一个列日期只有一年,一个月似乎丢失:
> data.frame(as.matrix(seatbelts), date=time(seatbelts))
DriversKilled drivers front rear kms PetrolPrice VanKilled law date
1 107 1687 867 269 9059 0.10297 12 0 1969
2 97 1508 825 265 7685 0.10236 6 0 1969
3 102 1507 806 319 9963 0.10206 12 0 1969
4 87 1385 814 407 10955 0.10087 8 0 1969
5 119 1632 991 454 11823 0.10102 10 0 1969
6 106 1511 945 427 12391 0.10058 13 0 1969
我想无论是用年份和月份日期列,或日期和一年一个单独的列。
你得到的日期实际上是一个小数年,所以这个月是不是还在那里。如果你想有两列,年份和月份,你可以尝试这样的:
res <- data.frame(as.matrix(Seatbelts), date=time(Seatbelts))
res$year <- trunc(res$date)
res$month <- (res$date - res$year) * 12 + 1
res
## DriversKilled drivers front rear kms PetrolPrice VanKilled law date year month
## 1 107 1687 867 269 9059 0.1029718 12 0 1969.000 1969 1
## 2 97 1508 825 265 7685 0.1023630 6 0 1969.083 1969 2
## 3 102 1507 806 319 9963 0.1020625 12 0 1969.167 1969 3
## 4 87 1385 814 407 10955 0.1008733 8 0 1969.250 1969 4
## 5 119 1632 991 454 11823 0.1010197 10 0 1969.333 1969 5
## 6 106 1511 945 427 12391 0.1005812 13 0 1969.417 1969 6
我可能误解了要求,但要获得个月和一年的产量,与去年月日,您都可以转换成先xts
格式数据框 - 后者转换好得多通常记录比ts
对象。下面的操作是很不成熟 - 提取文本到新列。
library(xts)
library(tidyverse)
tsx <- as.xts(datasets::Seatbelts)
df <- data.frame(date=index(tsx), coredata(tsx)) %>%
mutate(date_chr = as.character(date),
month = substr(date, 1, 3),
year = substr(date, 5, 8))
date DriversKilled drivers front rear kms PetrolPrice VanKilled law date_chr month year
1 Jan 1969 107 1687 867 269 9059 0.1029718 12 0 Jan 1969 Jan 1969
2 Feb 1969 97 1508 825 265 7685 0.1023630 6 0 Feb 1969 Feb 1969
3 Mar 1969 102 1507 806 319 9963 0.1020625 12 0 Mar 1969 Mar 1969
4 Apr 1969 87 1385 814 407 10955 0.1008733 8 0 Apr 1969 Apr 1969
5 May 1969 119 1632 991 454 11823 0.1010197 10 0 May 1969 May 1969
6 Jun 1969 106 1511 945 427 12391 0.1005812 13 0 Jun 1969 Jun 1969