Мы можем сделать это легко с Map
. Передайте Date
преобразованный столбец 'start' и 'end' набора данных в качестве аргументов Map
, получите последовательность 'month's как list
и разверните' id 'на основе lengths
из list
а также объединить элементы list
для создания расширенного фрейма данных
lst1 <- Map(seq, MoreArgs = list(by = 'month'), as.Date(df$start), as.Date(df$end))
data.frame(id = rep(df$id, lengths(lst1)), date = do.call(c, lst1))
# id date
#1 2 2018-10-01
#2 2 2018-11-01
#3 2 2018-12-01
#4 3 2018-01-01
#5 3 2018-02-01
#6 3 2018-03-01
#7 3 2018-04-01
Или, используя tidyverse
, мы mutate
class
столбцов 'start', 'end' до Date
, используя map2
(из purrr
), получим seq
значение даты от «начала» до «конца» by
«месяца» и расширяют данные на unnest
с набором данных
library(tidyverse)
df %>%
mutate_at(2:3, as.Date) %>%
transmute(id = id, date = map2(start, end, ~ seq(.x, .y, by = 'month'))) %>%
unnest
# id date
#1 2 2018-10-01
#2 2 2018-11-01
#3 2 2018-12-01
#4 3 2018-01-01
#5 3 2018-02-01
#6 3 2018-03-01
#7 3 2018-04-01