2016-10-12 1 views
1

У меня есть кадр данных, который выглядит следующим образом:Для каждой строки в кадре данных, создать несколько строк на основе даты диапазоны

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(), которая может создать список дат, необходимых, но я не знаю, как применить это к каждой строке, не используя для петля.

ответ

2

Используя 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 

Объяснение:

  • Первая строка кода преобразует столбцы даты в дата- формат.
  • Группа по всем колонкам() и создайте последовательность с seq(StartDate,EndDate,'day').