创建月度数据和扩展数据

use*_*187 5 r dplyr tidyr

我有一个数据框,我想基于以下数据集创建一个不平衡的面板.

 profile<- c('lehman', 'john','oliver','stephen','picasso')
 start_date<-   c(2008-01-01, 2008-02-02,2008-04-02,2008-09-02,2009-02-02)
 end_date <-   c (2009-12-31, 2009-12-31, 2009-12-31,2009-12-31,2009-12-31)
 df<- data.frame(profile,start_date,end_date)
Run Code Online (Sandbox Code Playgroud)

我想创建两列tid和myear.Myear基本上是从开始日期开始的月份,并且基于月份直到最后结束日期不断扩展.然后我需要一个tid,其编号为01,用于myear 01-2008,02用于02-2008 ....所以12-2009为24.有人可以建议如何做到这一点吗?这是预期的输出.

 profile      start_date    end_date     tid   myear
 lehman       2008-01-01    2009-12-31   01   01-2008
 lehman       2008-01-01    2009-12-31   02   02-2008
 ...          ..            ..           ..
 lehman       2008-01-01    2009-12-31   24   12-2009
 john         2008-02-02    2009-12-31   02   02-2008
 john         2008-02-02    2009-12-31   03   03-2008
 ..           ..             ..          ..
 john         2008-02-02    2009-12-31   24   12-2009
 ...          ..            ...          ..
 picasso      2009-02-02    2009-12-31   14   02-2009
 picasso      2009-03-02    2009-12-31   15   03-2009     
 ...          ...           ...          ..
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 5

这是一个想法.首先确保您的日期是as.Date(即df[2:3] <- lapply(df[2:3], function(i) as.Date(i, format = '%Y-%m-%d')).然后创建一个列表,其中包含开始日期和结束日期之间的每月序列.计算该列表的长度并使用它们来扩展您的数据框.将日期序列添加为新列并tid基于创建在每个配置文件的长度上.

seq_lst <- lapply(Map(function(x, y) seq(x, y, by = 'months'), 
                      df$start_date, df$end_date), function(i) format(i, '%m-%Y'))

df <- df[rep(seq_len(nrow(df)), lengths(seq_lst)),]

df$myear <- unlist(seq_lst)

i1 <- setNames(seq(length(seq_lst[[1]])), seq_lst[[1]])
df$tid <- sprintf('%02d', i1[match(df$myear, names(i1))])

head(df)
#    profile start_date   end_date   myear tid
#1    lehman 2008-01-01 2009-12-31 01-2008  01
#1.1  lehman 2008-01-01 2009-12-31 02-2008  02
#1.2  lehman 2008-01-01 2009-12-31 03-2008  03
#1.3  lehman 2008-01-01 2009-12-31 04-2008  04
#1.4  lehman 2008-01-01 2009-12-31 05-2008  05
#1.5  lehman 2008-01-01 2009-12-31 06-2008  06
Run Code Online (Sandbox Code Playgroud)