【问题标题】:Mutate Time values into categorical values将时间值更改为分类值
【发布时间】:2020-08-21 06:10:57
【问题描述】:

我目前有一个带有时间戳的数据框,我将其转换为 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" ))

【问题讨论】:

  • 可以加dput(head(df))吗?
  • structure(list(ReceiptNo = c("101", "102", "103", "104", "105", "106"), Time = new("Period", .数据 = c(35, 51, 5, 26, 13, 43),年 = c(0, 0, 0, 0, 0, 0),月 = c(0, 0, 0, 0, 0, 0) , 天 = c(0, 0, 0, 0, 0, 0), 小时 = c(14, 14, 14, 14, 14, 14), 分钟 = c(54, 54, 55, 55, 56, 57 ))), row.names = c(NA, -6L), class= c("tbl_df", "tbl", "data.frame"))
  • 与您的声明,例如hour &lt;= 14 ~ "Midday",直觉上我猜这意味着14:00:00应该是Midday14:00:01应该跳转到Afternoon,对吧?请澄清一下。它使 Ronak 和我的答案有不同的输出。

标签: r dplyr lubridate


【解决方案1】:

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

【讨论】:

  • 啊,我明白了,我会读一下,不知道那个类。谢谢!
  • 嗨,您的方法将 14H 53M 55S 转换为 Midday,但根据 OP 的规则,它应该是 Afternoon
  • 我的方法根据一天中的时间对数据进行分类。如果 OP 希望将 14 包含为“下午”,我想将所有值更改 1 是微不足道的吗?所以不是hour &lt;= 14,而是hour &lt;= 13
  • OP 的声明是hour &lt;= 14 ~ "Midday"。直觉上我猜这意味着14:00:00 应该是Midday14:00:01 应该跳转到Afternoon。如果只提取hour 部分,则14:00:0014:00:01 始终归入同一组。当然,这取决于OP的想法。感谢您的回复!
【解决方案2】:

Time 列属于&lt;Period&gt; 类,它记录从00:00:00 过去的秒数。您需要将这些时间点转换为&lt;Period&gt; 对象。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多