我有一个数据框架,如下所示:
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循环的情况下将其应用于每一行。
发布于 2016-10-12 19:31:52
使用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')创建序列。https://stackoverflow.com/questions/40006727
复制相似问题