Trasforma i valori Tempo in valori categorici

Aug 21 2020

Al momento ho un frame di dati con un timestamp in formato carattere che ho convertito in HMS

df$Time <- hms(df$Time)

Sto cercando di mutare il set di dati per includere una colonna categorica con l'ora del giorno

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

Ho provato diverse varianti di quanto segue per mutare una nuova colonna senza successo

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

Risposte

1 RonakShah Aug 21 2020 at 13:37

Timeè di periodclasse. Estrai l'ora da esso e usalo in 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 DarrenTsai Aug 21 2020 at 13:42

La colonna Timeè della classe <Period>, che registra il numero di secondi che passano da 00:00:00. Devi convertire quei punti temporali in <Period>oggetti.

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 akrun Aug 22 2020 at 02:45

Invece di usare condizioni multiple in case_when possiamo usare cut with labels.

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