Создание мин. дата и макс. столбцы даты на основе квартала, месяца, с начала года - PullRequest
1 голос
/ 09 мая 2020

У меня есть следующий фрейм данных:

Frequency  Period   Period No.  Year
Monthly    1        1           2018
Quarterly  Q1       3           2018
YTD        YTD-Feb  2           2019    

На основе этих столбцов я хотел бы добавить мин. дата и макс. столбец даты, чтобы фрейм данных выглядел так:

Frequency  Period   Period No.  Year  Min. Date  Max. Date
Monthly    1        1           2018  1/1/2018   1/31/2018
Quarterly  Q1       3           2018  1/1/2018   3/31/2018
YTD        YTD-Feb  2           2019  1/1/2019   2/28/2019

1 Ответ

0 голосов
/ 09 мая 2020

Если нам нужен максимум, минимум на основе "PeriodNo." столбец, создайте последовательность дат по месяцам из столбца 'Год', затем извлеките min и max`

library(dplyr)
library(purrr)
library(lubridate)
library(stringr)
df1 %>% 
   mutate(date = map2(as.Date(str_c(Year, '-01-01')), 
   PeriodNo., ~ seq(.x, length.out = .y, by = '1 month')), 
   Min.Date =   do.call(c, map(date, min)), 
   Max.Date = do.call(c, map(date, ~ceiling_date(max(.x), 'month')-1))) %>% 
   select(-date)
#  Frequency  Period PeriodNo. Year   Min.Date   Max.Date
#1   Monthly       1         1 2018 2018-01-01 2018-01-31
#2 Quarterly      Q1         3 2018 2018-01-01 2018-03-31
#3       YTD YTD-Feb         2 2019 2019-01-01 2019-02-28

Или вариант с Map

lst1 <- Map(function(x, y) seq(as.Date(paste0(x, "-01-01")), 
    length.out = y, by = '1 month'), df1$Year, df1$PeriodNo.)
df1$Min.Date <- do.call(c, lapply(lst1, min))
df1$Max.Date <- do.call(c, lapply(lst1, function(x) (max(x) + months(1) -1)) )

данные

df1 <- structure(list(Frequency = c("Monthly", "Quarterly", "YTD"), 
    Period = c("1", "Q1", "YTD-Feb"), PeriodNo. = c(1L, 3L, 2L
    ), Year = c(2018L, 2018L, 2019L)), class = "data.frame",
    row.names = c(NA, 
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...