[英]How to expand a time series in R
請注意,這不是其他時間序列擴展問題的重復。 沒有開始日期和結束日期,它基於一個月中天數的值,並且重復月份。
說我有以下數據集:
dates<-c("2019-01-07", "2019-02-07", "2019-03-07", "2019-01-22", "2019-02-25")
month<-c("Jan", "Feb", "March", "Jan", "Feb")
no_days_PerMonth <-c(31, 28, 31, 31, 28)
values<-c(54,89,100, 50, 6)
(test<-as.data.frame(cbind(dates, no_days_PerMonth, month, values)))
dates no_days_PerMonth month values
1 2019-01-07 31 Jan 54
2 2019-02-07 28 Feb 89
3 2019-03-07 31 March 100
4 2019-01-22 31 Jan 50
5 2019-02-25 28 Feb 6
我想做的是生成一個新的數據框,該數據框使用dates
變量月份中的天數,並擴展行數以匹配該月的特定天數,並將列values
映射到每個新的行。 我想要以下幾種方法:
dates no_days_PerMonth month values new_date
2019-01-07 31 Jan 54 2019-01-01
2019-01-07 31 Jan 54 2019-01-02
2019-01-07 31 Jan 54 2019-01-03
2019-01-07 31 Jan 54 2019-01-04
2019-01-07 31 Jan 54 2019-01-05
2019-01-07 31 Jan 54 2019-01-06
2019-01-07 31 Jan 54 2019-01-07
2019-01-07 31 Jan 54 2019-01-08
2019-01-07 31 Jan 54 2019-01-09
2019-01-07 31 Jan 54 2019-01-10
2019-01-07 31 Jan 54 2019-01-11
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54 .
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-01-07 31 Jan 54
2019-02-07 28 Feb 89 2019-02-01
2019-02-07 28 Feb 89 2019-02-02
2019-02-07 28 Feb 89 2019-02-03
2019-02-07 28 Feb 89 2019-02-04
2019-02-07 28 Feb 89 2019-02-05
2019-02-07 28 Feb 89 2019-02-06
2019-02-07 28 Feb 89 2019-02-07
2019-02-07 28 Feb 89 2019-02-08
2019-02-07 28 Feb 89 2019-02-09
2019-02-07 28 Feb 89 2019-02-10
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89 .
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
2019-02-07 28 Feb 89
“ ...”僅表示數據擴展的繼續(我不想花時間將其全部寫出來)。 另外,在下面的示例數據集中,僅在原始數據集中的前兩個日期顯示擴展,因為我不想花時間將其全部寫出來。
這是一個data.table
plus lubridate
解決方案
library(data.table)
library(lubridate)
setDT(test)[, .(dates, no_days_PerMonth, month, values, new_date = seq(
floor_date(as.Date(dates), "month"),
floor_date(as.Date(dates), "month") %m+% days(as.numeric(as.character(no_days_PerMonth))),
by = "day")), by = dates]
# dates dates no_days_PerMonth month values new_date
#1: 2019-01-07 2019-01-07 31 Jan 54 2019-01-01
#2: 2019-01-07 2019-01-07 31 Jan 54 2019-01-02
#3: 2019-01-07 2019-01-07 31 Jan 54 2019-01-03
#4: 2019-01-07 2019-01-07 31 Jan 54 2019-01-04
#5: 2019-01-07 2019-01-07 31 Jan 54 2019-01-05
#---
#150: 2019-02-25 2019-02-25 28 Feb 6 2019-02-25
#151: 2019-02-25 2019-02-25 28 Feb 6 2019-02-26
#152: 2019-02-25 2019-02-25 28 Feb 6 2019-02-27
#153: 2019-02-25 2019-02-25 28 Feb 6 2019-02-28
#154: 2019-02-25 2019-02-25 28 Feb 6 2019-03-01
說明:我們使用floor_date
從dates
獲取月份的第一天,然后使用seq.Date
從dates
的第一天開始擴展dates
,直到從dates
加上 no_days_PerMonth
的月份的第一天no_days_PerMonth
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.