r - 创建分钟。日期和最大值 基于季度、月份、年初至今的日期列
问题描述
我有一个如下数据框:
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
解决方案
如果我们需要基于“PeriodNo”的最大值,最小值。列,从“年”列中按月创建日期序列,然后提取 min
和最大值`
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))
推荐阅读
- unix - UNIX 中的语法问题
- angular - AG-Grid树数据结构
- java - 用于列表迭代的 Java 8 Streams
- javascript - 将 django 数组传递给 example.js
- codeigniter - SQL | 从有条件的 2 个表中获取查询
- sql-server - 如何将 sql datetime2 转换为加倍?
- enterprise-architect - EA Sparx 查询中的 WITH 子句
- mysql - 如何使用nodejs从mysql中解码汉字
- java - 从嵌套的 java 对象中获取字段的所有值
- json - 如何在 apache nifi 中为 kafka 生产者指定密钥?