R 基于时间范围创建列

R 基于时间范围创建列,r,time,R,Time,我一直在尝试根据时间范围创建一个新列:准时(12:00:00之前)、迟到(12:00:00到15:00:00之间)和非常晚(15:00:00之后)。我可以根据固定的时间而不是范围创建列 资料 期望输出 time worker Day Arrival 1 2020-07-21 15:25:00 Ryan Tue very late 2 2020-07-21 11:20:00 Tim Tue punctual 3 2020-07-21 11:30:0

我一直在尝试根据时间范围创建一个新列:准时(12:00:00之前)、迟到(12:00:00到15:00:00之间)和非常晚(15:00:00之后)。我可以根据固定的时间而不是范围创建列

资料

期望输出

                 time worker Day   Arrival
1 2020-07-21 15:25:00   Ryan Tue very late
2 2020-07-21 11:20:00    Tim Tue  punctual
3 2020-07-21 11:30:00   John Tue  punctual
4 2020-07-21 14:00:00   Adam Tue      late
错误代码

df<-df %>% mutate(hour = lubridate::hour(time), minutes = lubridate::minutes(time),Arrival = case_when(hour <- 12 | (hour == 12 & minutes <= 30) ~ 'punctual', 
                                                                                             hour <- 15 | (hour == 15 & minutes <= 30) ~ 'late',
                                                                                             TRUE ~ 'very late'))

df%变异(小时=lubridate::小时(时间),分钟=lubridate::分钟(时间),到达=case_when(小时您可以使用
case_when
并单独指定每个条件:

library(dplyr)
library(lubridate)

df %>%
  mutate(hour = hour(time),
         Arrival = case_when(hour < 12 ~ 'punctual', 
                             hour < 15 ~ 'late', 
                             TRUE ~ 'very late'))

为了将此扩展到最高达分钟级别的精度,我们可以在以下情况下使用
case\u:

df %>% 
  mutate(hour = hour(time), 
         minutes = minute(time),
         Arrival = case_when(
                hour < 12 | (hour == 12 & minutes <= 30) ~ 'punctual', 
                hour < 15 | (hour == 15 & minutes <= 30) ~ 'late',
                TRUE ~ 'very late'))

谢谢Ronak Shah!如果是12:30:00和15:30:00呢?根据这里的逻辑,他们将分别迟到和非常晚。至于标准,如果我也想包括会议记录呢?在这种情况下,你可以在
方法时使用
case\u。类似于
hour
还有另一个
分钟用
lubridate::minutes
设置s
列,并更改条件。例如,如果您希望12:30之前的时间是“准时的”。Do
hour<12 |(hour==12&minutes我在
lapply(件,如.numeric)中遇到此错误:强制引入的NAs
。我将插入当前代码以解决上述问题
df$Arrival <- cut(as.integer(format(df$time, '%H')), c(0, 11, 14, 23), 
                  c('punctual', 'late', 'very late'))

df
#                 time worker Day    Arrival
#1 2020-07-21 15:25:00   Ryan Tue  very late
#2 2020-07-21 11:20:00    Tim Tue   punctual
#3 2020-07-21 11:30:00   John Tue   punctual
#4 2020-07-21 14:00:00   Adam Tue       late
df %>% 
  mutate(hour = hour(time), 
         minutes = minute(time),
         Arrival = case_when(
                hour < 12 | (hour == 12 & minutes <= 30) ~ 'punctual', 
                hour < 15 | (hour == 15 & minutes <= 30) ~ 'late',
                TRUE ~ 'very late'))
df <- structure(list(time = structure(c(1595345100, 1595330400, 1595331000, 
1595340000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    worker = c("Ryan", "Tim", "John", "Adam"), Day = c("Tue", 
  "Tue", "Tue", "Tue")), row.names = c("1", "2", "3", "4"), class = "data.frame")