Определите, если день недели 2-й / 3-й и т. Д. c Пн / Вт / т. Е. c день месяца в R - PullRequest
1 голос
/ 13 февраля 2020

Учитывая дату и день недели, я хочу знать, есть ли код, который сообщает мне, какой из этих дней месяца это. Например, на рисунке ниже, учитывая 2/12/2020 и «среду», я хочу получить вывод «2», поскольку это вторая среда месяца.

sample

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Вы можете сделать это в базе R по существу за одну операцию. Вам также не нужен второй входной столбец.

Вот более медленное прохождение:

Код

dates <- c("2/12/2020","2/11/2020","2/10/2020","2/7/2020","2/6/2020", "2/5/2020")
Dates <- anytime::anydate(dates)   ## one of several parsers
dow   <- weekdays(Dates)           ## for illustration, base R function
cnt   <- (as.integer(format(Dates, "%d")) - 1) %/% 7 + 1

res <- data.frame(dt=Dates, dow=dow, cnt=cnt)
res

(Финальный) Вывод

R> res
          dt       dow cnt
1 2020-02-12 Wednesday   2
2 2020-02-11   Tuesday   2
3 2020-02-10    Monday   2
4 2020-02-07    Friday   1
5 2020-02-06  Thursday   1
6 2020-02-05 Wednesday   1
R> 

Такая функциональность часто присутствует в специальных библиотеках даты / времени. Я обернул некоторый код из библиотеки (C ++) Boost date_time в пакет RcppBDH - что позволило легко найти «третью среду в прошлом месяце каждого квартала» и т. Д.

3 голосов
/ 13 февраля 2020
(lubridate::day(your_date) - 1) %/% 7 + 1

Идея в том, что первые 7 дней месяца являются первыми для их дня недели. Следующие 7 - 2-е, et c.

> (1:30 - 1) %/% 7 + 1
# [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5
2 голосов
/ 13 февраля 2020

Просто чтобы предложить альтернативный расчет для n-го дня недели месяца, вы можете просто разделить день на 7 и всегда округлять:

date <- lubridate::mdy("02/12/2020")
ceiling(day(date)/7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...