В настоящее время у меня есть фрейм данных с отметкой времени в символьной форме, который я преобразовал в 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" ))
1
Raul 21 Авг 2020 в 09:10

3 ответа

Лучший ответ

Time принадлежит к классу period. Извлеките из него час и используйте его в 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"))
1
Ronak Shah 21 Авг 2020 в 06:37

Столбец Time относится к классу <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
1
Darren Tsai 21 Авг 2020 в 06:42

Вместо использования нескольких условий в 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")))
1
akrun 21 Авг 2020 в 19:45