对于数据框中的每一行,根据日期范围创建多行

时间:2016-10-12 19:21:22

标签: r dataframe

我有一个如下所示的数据框:

Name    StartDate   EndDate
A   12/12/2012  12/15/2012
B   11/11/2012  11/14/2012

对于上面的每一行,我想生成一个带有一个名为“Date”的附加列的行,该列的范围介于上面的开始日期和结束日期之间。因此,上面的数据框将产生另一个数据框:

Name    StartDate   EndDate Date
A   12/12/2012  12/15/2012  12/12/2012
A   12/12/2012  12/15/2012  12/13/2012
A   12/12/2012  12/15/2012  12/14/2012
A   12/12/2012  12/15/2012  12/15/2012
B   11/11/2012  11/14/2012  11/11/2012
B   11/11/2012  11/14/2012  11/12/2012
B   11/11/2012  11/14/2012  11/13/2012
B   11/11/2012  11/14/2012  11/14/2012

我找到了可以创建所需日期列表的seq.Date()函数,但我不知道如何在不使用for循环的情况下将其应用于每一行。

1 个答案:

答案 0 :(得分:4)

使用您可以执行的data.table包:

library(data.table)
setDT(df)[, c('StartDate', 'EndDate') := lapply(.SD, as.Date, format = '%m/%d/%Y'), .SDcols = 2:3
          ][, .(date = seq(StartDate, EndDate, 'day')), by = .(Name, StartDate, EndDate)]

给出:

   Name  StartDate    EndDate       date
1:    A 2012-12-12 2012-12-15 2012-12-12
2:    A 2012-12-12 2012-12-15 2012-12-13
3:    A 2012-12-12 2012-12-15 2012-12-14
4:    A 2012-12-12 2012-12-15 2012-12-15
5:    B 2012-11-11 2012-11-14 2012-11-11
6:    B 2012-11-11 2012-11-14 2012-11-12
7:    B 2012-11-11 2012-11-14 2012-11-13
8:    B 2012-11-11 2012-11-14 2012-11-14

说明:

  • 第一行代码将日期列转换为日期格式。
  • 按所有列(by = .(Name,StartDate,EndDate))分组,并使用seq(StartDate,EndDate,'day')创建序列。