時間値をカテゴリ値に変更します

Aug 21 2020

現在、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 RonakShah Aug 21 2020 at 13:37

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 DarrenTsai Aug 21 2020 at 13:42

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

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")))