R 以不同的单位展开时间序列

R 以不同的单位展开时间序列,r,dplyr,time-series,tidyverse,R,Dplyr,Time Series,Tidyverse,我有一个时间序列,看起来像: id date type 1 1 2019-06-16 1_month 2 1 2019-07-16 1_month 3 1 2019-08-08 1_month 4 1 2019-09-04 3_months 5 2 2019-01-23 1_month 6 2 2019-05-05 1_month 7 2 2019-07-10 3_months 8 3 2019-07-02 1_month 9

我有一个时间序列,看起来像:

   id       date     type
1   1 2019-06-16  1_month
2   1 2019-07-16  1_month
3   1 2019-08-08  1_month
4   1 2019-09-04 3_months
5   2 2019-01-23  1_month
6   2 2019-05-05  1_month
7   2 2019-07-10 3_months
8   3 2019-07-02  1_month
9   3 2020-04-18 3_months
10  4 2019-03-10  1_month
11  4 2019-04-08  1_month

library(tidyverse)

df <- data.frame(stringsAsFactors=FALSE,
              id = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4),
            date = c("2019-06-16", "2019-07-16", "2019-08-08", "2019-09-04",
                     "2019-01-23", "2019-05-05", "2019-07-10",
                     "2019-07-02", "2020-04-18", "2019-03-10", "2019-04-08"),
            type = c("1_month", "1_month", "1_month", "3_months", "1_month",
                     "1_month", "3_months", "1_month", "3_months",
                     "1_month", "1_month")
    )
但我得到:

Error in seq.default(date, by = "30 days", length.out = 3) : 
  'from' must be a finite number

感谢您的帮助

这可能可以更有效地完成,但我认为这会让您获得所需的元素,并根据“真实”数据集进行一点控制:

库(tidyverse)
图书馆(lubridate)
df%
as_tible()%>%
分开(类型,分为=c(“数字”,“日期类型”))%>%
变异(
数字=作为数字(数字),
日期=截止日期(日期)
) %>%
行()
变异(
日期=日期%m+%个月(数字-1),
日期顺序=列表(顺序日期(日期,日期结束,按=“1个月”))
) %>%
unnest(日期)
#>#tibble:17 x 6
#>id日期编号日期类型日期结束日期
#>                          
#>1 2019-06-16 1个月2019-06-16 2019-06-16
#>2019-07-16一个月2019-07-16 2019-07-16
#>3 1 2019-08-08 1个月2019-08-08 2019-08-08
#>4 1 2019-09-04 3个月2019-11-04 2019-09-04
#>5 1 2019-09-04 3个月2019-11-04 2019-10-04
#>6 1 2019-09-04 3个月2019-11-04 2019-11-04
#>7 2 2019-01-23 1个月2019-01-23 2019-01-23
#>8 2 2019-05-05 1个月2019-05-05 2019-05-05
#>9 2 2019-07-10 3个月2019-09-10 2019-07-10
#>10 2 2019-07-10 3个月2019-09-10 2019-08-10
#>11 2 2019-07-10 3个月2019-09-10 2019-09-10
#>12 3 2019-07-02 1个月2019-07-02 2019-07-02
#>13 3 2020-04-18 3个月2020-06-18 2020-04-18
#>14 3 2020-04-18 3个月2020-06-18 2020-05-18
#>15 3 2020-04-18 3个月2020-06-18 2020-06-18
#>16 4 2019-03-10 1个月2019-03-10 2019-03-10
#>17 4 2019-04-08一个月2019-04-08 2019-04-08

由(v0.3.0)于2020年5月11日创建的我们可以从
lubridate
包中获得一些帮助。关键是在
date
列中按顺序添加30天作为列表,然后
unest
该列

library(tidyverse)
library(lubridate)

df2 <- df %>%
  mutate(type2 = as.integer(str_replace(type, "_month$|_months$", ""))) %>%
  mutate(date = ymd(date)) %>%
  mutate(dates = map2(date, type2, function(x, y){
    seq_num <- 0:(y - 1)
    date_seq <- map_chr(seq_num, function(i) as.character(x + days(i * 30)))
    return(date_seq)
  })) %>%
  select(id, date = dates) %>%
  unnest(cols = date) %>%
  mutate(type = "1_month")
df2
# # A tibble: 17 x 3
#       id date       type   
#    <dbl> <chr>      <chr>  
#  1     1 2019-06-16 1_month
#  2     1 2019-07-16 1_month
#  3     1 2019-08-08 1_month
#  4     1 2019-09-04 1_month
#  5     1 2019-10-04 1_month
#  6     1 2019-11-03 1_month
#  7     2 2019-01-23 1_month
#  8     2 2019-05-05 1_month
#  9     2 2019-07-10 1_month
# 10     2 2019-08-09 1_month
# 11     2 2019-09-08 1_month
# 12     3 2019-07-02 1_month
# 13     3 2020-04-18 1_month
# 14     3 2020-05-18 1_month
# 15     3 2020-06-17 1_month
# 16     4 2019-03-10 1_month
# 17     4 2019-04-08 1_month     
库(tidyverse)
图书馆(lubridate)
df2%
mutate(type2=as.integer(str_replace(type,“_month$| _months$”,”)%>%
突变(日期=ymd(日期))%>%
mutate(日期=map2(日期,类型2,函数(x,y){
序号%
unnest(cols=日期)%>%
变异(type=“1个月”)
df2
##A tibble:17 x 3
#id日期类型
#             
#2019-06-16一个月
#2019-07-16一个月
#2019-08-08一个月
#4.1 2019-09-04一个月
#5.1 2019-10-04一个月
#6.1 2019-11-03一个月
#7 2 2019-01-23一个月
#8 2 2019-05-05一个月
#9 2 2019-07-10一个月
#1022019-08-09一个月
#11 2 2019-09-08一个月
#12 3 2019-07-02一个月
#13 3 2020-04-18一个月
#14 3 2020-05-18一个月
#15 3 2020-06-17一个月
#16 4 2019-03-10一个月
#17 4 2019-04-08一个月
Error in seq.default(date, by = "30 days", length.out = 3) : 
  'from' must be a finite number
library(tidyverse)
library(lubridate)

df2 <- df %>%
  mutate(type2 = as.integer(str_replace(type, "_month$|_months$", ""))) %>%
  mutate(date = ymd(date)) %>%
  mutate(dates = map2(date, type2, function(x, y){
    seq_num <- 0:(y - 1)
    date_seq <- map_chr(seq_num, function(i) as.character(x + days(i * 30)))
    return(date_seq)
  })) %>%
  select(id, date = dates) %>%
  unnest(cols = date) %>%
  mutate(type = "1_month")
df2
# # A tibble: 17 x 3
#       id date       type   
#    <dbl> <chr>      <chr>  
#  1     1 2019-06-16 1_month
#  2     1 2019-07-16 1_month
#  3     1 2019-08-08 1_month
#  4     1 2019-09-04 1_month
#  5     1 2019-10-04 1_month
#  6     1 2019-11-03 1_month
#  7     2 2019-01-23 1_month
#  8     2 2019-05-05 1_month
#  9     2 2019-07-10 1_month
# 10     2 2019-08-09 1_month
# 11     2 2019-09-08 1_month
# 12     3 2019-07-02 1_month
# 13     3 2020-04-18 1_month
# 14     3 2020-05-18 1_month
# 15     3 2020-06-17 1_month
# 16     4 2019-03-10 1_month
# 17     4 2019-04-08 1_month