применить функцию один необработанный ввод, много исходный вывод - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такая таблица:

customer   ID    startdate   enddate
11         22   2015-01-01  2015-03-01
11         55   2018-04-03  2018-06-16
22         33   2017-02-01  2017-04-01

И это вывод, который я хочу:

   customer    Id  YearMonth
    11         22   201501
    11         22   201502
    11         22   201503
    11         55   201804
    11         55   201805
    11         55   201806
    22         33   201702
    22         33   201703
    22         33   201704
    22         33   201505

Я начал писать эту функцию:

datseq<-function(t1,t2) {
seq(as.Data(t1), as.Date(t2), by="month")
}

Мои вопросы:

а. Как я могу исправить функцию, чтобы вернуть мне формат ГГГГММ?

б. Как я могу реализовать эту функцию на фрейме данных, чтобы каждый клиент и идентификатор получали соответствующий список месяцев? На выходе должен быть фрейм данных.

Спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Мы можем сделать это с помощью 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"))
...