在 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"
我有一列日期,我想将其分配给一周开始的星期日。
例如: 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"