我有一个如下所示的数据框:
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循环的情况下将其应用于每一行。
答案 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')
创建序列。