Даты% в% Интервалы - PullRequest
       23

Даты% в% Интервалы

1 голос
/ 01 ноября 2019

Бег в настоящий головной убор и не уверен, как решить. Очень надеюсь, что некоторые из вас смогут помочь. Кроме того, я впервые внес свой вклад в StackOverflow .... ууу!

library(tidyverse)
library(lubridate)

start_date <- ymd("2014-06-28")
end_date <- ymd("2019-06-30")
PayPeriod_EndDate <- seq(start_date, end_date, by = '2 week')
PayPeriod_Interval <- int_diff(PayPeriod_EndDate)

Это создает вектор интервалов, каждый из которых представляет период выплаты продолжительностью две недели. Это первая часть, а первая часть относительно проста (хотя все же потребовалось некоторое время, чтобы понять, ха).

Часть вторая содержит вектор дат.

Dates <- c("2014-07-08", "2018-10-20", "2018-12-13", "2018-12-13", "2018-12-06", "2018-11-30", "2019-01-16", "2019-01-23", "2019-03-15", "2018-10-02")

Я хочу идентифицировать Даты %within% Интервалы , с выводом , являющимся интервалом, в котором находится каждая дата. Поэтому дате "2014-07-08" будет присвоено 2014-06-28 UTC--2014-07-12 UTC, поскольку эти даты находятся в пределах этого интервала.

Здесь, похоже, была исследована очень похожая проблема ... https://github.com/tidyverse/lubridate/issues/658

У меня естьпопытался выполнить следующее

ymd(Dates) %within% PayPeriod_Interval

Однако результат вычисляется только для первого элемента в векторе Dates . С тех пор я пробовал различные комбинации циклов for, мутировав в факторы и т. Д., С небольшим прогрессом. Это связано с работой, поэтому у меня действительно дефицит времени, и я буду следить за этим постом в течение дня и выходных.

Лучший и спасибо! Джеймс

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Тидиверс очень полезен, но иногда база R - это все, что вам нужно. В этом случае функция cut - это все, что вам нужно.

library(lubridate)

start_date <- ymd("2014-06-28")
end_date <- ymd("2019-06-30")
PayPeriod_EndDate <- seq(start_date, end_date, by = '2 week')

Dates <- c("2014-07-08", "2018-10-20", "2018-12-13", "2018-12-13", "2018-12-06", "2018-11-30", "2019-01-16", "2019-01-23", "2019-03-15", "2018-10-02")


startperiod<-cut(as.Date(Dates), breaks=PayPeriod_EndDate)
endperiod<-as.Date(startperiod)+13

Выход из функции вырезания - это начальная дата каждого периода выплаты, в котором находится переменная "Даты".

0 голосов
/ 01 ноября 2019

Вот как может выглядеть map - решение:

map(ymd(Dates), ~ PayPeriod_Interval[.x %within% PayPeriod_Interval])
# [[1]]
# [1] 2014-06-28 UTC--2014-07-12 UTC
# 
# [[2]]
# [1] 2018-10-13 UTC--2018-10-27 UTC
# 
# ...

Чтобы получить результат в качестве вектора интервала (а не списка), вы можете использовать:

PayPeriod_Interval[map_int(ymd(Dates), ~ which(.x %within% PayPeriod_Interval))]

# [1] 2014-06-28 UTC--2014-07-12 UTC 2018-10-13 UTC--2018-10-27 UTC 2018-12-08 UTC--2018-12-22 UTC 2018-12-08 UTC--2018-12-22 UTC 2018-11-24 UTC--2018-12-08 UTC
# [6] 2018-11-24 UTC--2018-12-08 UTC 2019-01-05 UTC--2019-01-19 UTC 2019-01-19 UTC--2019-02-02 UTC 2019-03-02 UTC--2019-03-16 UTC 2018-09-29 UTC--2018-10-13 UTC

Если вас просто интересует конечная дата интервала, опция

PayPeriod_EndDate[map_int(ymd(Dates), ~ which.min(.x > PayPeriod_EndDate))]
# [1] "2014-07-12" "2018-10-27" "2018-12-22" "2018-12-22" "2018-12-08" "2018-12-08" "2019-01-19" "2019-02-02" "2019-03-16" "2018-10-13"

which.min возвращает номер записи первой даты PayPeriod_EndDate, который не меньше указанной даты ввектор дат, то есть дата, которая находится в конце определенного периода оплаты.

...