我有一个如下所示的数据框:
Name StartDate EndDate
A 12/12/2012 12/15/2012
B 11/11/2012 11/14/2012
对于上面的每一行,我想生成带有名为“日期”的附加列的行,该列的范围在上面的开始日期和结束日期之间。因此,上面的数据框将产生另一个数据框:
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 循环的情况下将其应用于每一行。
最佳答案
使用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')
创建序列.
关于r - 对于数据框中的每一行,根据日期范围创建多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40006727/