我有一个数据框,我想基于以下数据集创建一个不平衡的面板.
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)
这是一个想法.首先确保您的日期是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)