将时间值变异为分类值

Mutate Time values into categorical values

我目前有一个带有字符形式时间戳的数据框,我将其转换为 HMS

df$Time <- hms(df$Time)

我正在尝试改变数据集以包含一个带有时间的分类列

ReceiptNo   Time
99          14H 53M 55S
98          14H 53M 43S
97          14H 53M 28S
96          14H 53M 8S
95          14H 52M 53S
94          14H 52M 1S
93          14H 51M 41S
92          14H 51M 15S
91          14H 51M 0S
90          14H 50M 42S

我尝试了以下不同的变体来改变新列,但没有成功

df %>% 
  mutate(Time = case_when(
    Time <= 6 ~ "Night",
    Time <= 10 ~ "Morning",
    Time <= 14 ~ "Midday",
    Time <= 18 ~ "Afternoon",
    Time > 19 ~ "Night" ))

Time 属于 period class。从中提取小时并将其用于 case_when :

library(dplyr)
df %>% 
  mutate(hour = Time@hour,
         Time_of_day = case_when(
                         hour <= 6 ~ "Night",
                         hour <= 10 ~ "Morning",
                         hour <= 14 ~ "Midday",
                         hour <= 18 ~ "Afternoon",
                         hour > 19 ~ "Night"))

Time属于class<Period>,记录了从00:00:00经过的秒数。您需要将这些时间点转换为 <Period> 个对象。

library(dplyr)
library(lubridate)

df %>% 
  mutate(Time2 = case_when(
    Time <= hours(6) ~ "Night",
    Time <= hours(10) ~ "Morning",
    Time <= hours(14) ~ "Midday",
    Time <= hours(18) ~ "Afternoon",
    TRUE ~ "Night" ))

# # A tibble: 6 x 3
#   ReceiptNo Time        Time2    
#   <chr>     <Period>    <chr>    
# 1 101       14H 54M 35S Afternoon
# 2 102       14H 54M 51S Afternoon
# 3 103       14H 55M 5S  Afternoon
# 4 104       14H 55M 26S Afternoon
# 5 105       14H 56M 13S Afternoon
# 6 106       14H 57M 43S Afternoon

我们可以使用带标签的剪切,而不是在 case_when 中使用多个条件。

library(dplyr)
df %>%
    mutate(Time2 = cut(Time@hour, breaks = c(-Inf, 6, 10, 14, 18, Inf), 
         labels = c("Night", "Morning", "Midday", "Afternoon", "Night")))