Мы можем сделать это с помощью data.table
, сгруппировать по последовательности строк, создать последовательность от 'startdate' до 'enddate', указав by
как месячный и format
класс Date
для возврата ожидаемый формат ("%Y%m"
)
library(data.table)
setDT(df1)[, .(customer = customer[1], Id = ID[1],
YearMonth = format(seq(startdate, enddate, by = '1 month'), "%Y%m")),
by = 1:nrow(df1)]
Это также можно сделать с помощью tidyverse
library(tidyverse)
df1 %>%
mutate(YearMonth = map2(startdate, enddate,
~ seq(.x, .y, by = "1 month") %>%
format(., format = "%Y%m"))) %>%
select(-startdate, enddate) %>%
unnest
Если нам нужна опция base R
, тогда можно использовать Map
lst <- Map(function(x, y) seq(x, y, by = '1 month'), df1$startdate, df1$enddate)
Скопируйте строки набора данных по lengths
из list
и создайте столбец YearMonth, объединив элементы list
и получив ожидаемый format
data.frame(df1[rep(1:nrow(df1), lengths(lst)), 1:2],
YearMonth = format(do.call(c, lst), "%Y%m"))