在 case_when() 中使用条件向量而不是单独的行。润滑剂和 Dplyr

Using a vector for conditions instead of individual lines in case_when(). Lubridate and Dplyr

我有一列日期,我想将其分配给一周开始的星期日。

例如: 11/01/2021 将分配给“Week of 10/31/2021”,因为它介于 10/31/2021 和 11/6/2021 之间。尽管 11/10/2021 将分配给“Week of 11/07/2021”,因为它介于 11/07/2021 和 11/13/2021 之间。 示例:

library(lubridate)
library(tidyverse)
sunday_first <- "2021/10/31" %>% ymd()
sunday_last <-  "2021/11/28" %>% ymd()
list_weeks <- sunday_first + weeks(0:4)
list_days <- (sunday_first + days(0:30)) %>% enframe(value = "date")

list_days %>% mutate("Week of" = case_when(
                                  between(date, list_weeks[1], list_weeks[1] + 6) ~ list_weeks[1],
                                  between(date, list_weeks[2], list_weeks[2] + 6) ~ list_weeks[2],
                                  between(date, list_weeks[3], list_weeks[3] + 6) ~ list_weeks[3],
                                  between(date, list_weeks[4], list_weeks[4] + 6) ~ list_weeks[4])

)

如果 case_when 语句中没有这么多行代码,我怎么能做这样的事情多年?从精神上讲,我正在寻找的是如何通过条件向量。像这样:

list_days %>% mutate("Week of" = case_when(
                                  between(date, list_weeks[i], list_weeks[i] + 6) ~ list_weeks[i])
)

如果你只是想知道星期几,使用这个函数

weekOf <- function(date){
  days_after_sunday = wday(date)
  return(as.Date(date)-days(days_after_sunday-1))
}

week_str <- paste("Week of ", weekOf(Sys.Date()))

这个returnsWeek of 2021-11-07

您可以使用 lubridate 中的 floor_date 并为 unit 包含 week 吗? week_start 的默认值为 7(或星期日),因此您可以省略该参数。

library(lubridate)

list_days <- as.Date(c("2021-11-01", "2021-11-10"))

floor_date(list_days, unit = 'week')

输出

[1] "2021-10-31" "2021-11-07"