【问题标题】:How can I label time series data by unique nights?如何按独特的夜晚标记时间序列数据?
【发布时间】:2021-01-08 12:18:54
【问题描述】:

我想在不同的夜晚拆分时间序列数据集(仅包括夜间数据!)以分别为每个夜晚应用缺失值插补方法。这就是为什么我需要创建一个新变量“night”,分别标记每个晚上。

任何想法如何通过应用 dplyr::if_else()- 函数(例如,通过在 if 条件中使用“day”或“time”变量)正确创建变量“night”?

这是样本数据:

# Sample Data
timestamp <- c("2020-05-26 04:15:33","2020-05-26 06:15:33","2020-05-26 22:15:33", "2020-05-26 23:15:33", "2020-05-27 00:15:33", "2020-05-27 04:15:33", "2020-05-27 22:15:33","2020-05-28 00:15:33", "2020-05-28 04:15:33", "2020-05-28 22:15:33", "2020-05-29 00:15:33")
time <- c("04:15:33","06:15:33","22:15:33", "23:15:33", "00:15:33", "04:15:33", "22:15:33","00:15:33", "04:15:33", "22:15:33", "00:15:33")
day <- c(1,1,1,1,2,2,2,3,3,3,4)
df <- as.data.frame(cbind(timestamp, time, day))
 
df
#              timestamp     time day  
# 1  2020-05-26 04:15:33 04:15:33   1 
# 2  2020-05-26 06:15:33 06:15:33   1 
# 3  2020-05-26 22:15:33 22:15:33   1 
# 4  2020-05-26 23:15:33 23:15:33   1 
# 5  2020-05-27 00:15:33 00:15:33   2 
# 6  2020-05-27 04:15:33 04:15:33   2 
# 7  2020-05-27 22:15:33 22:15:33   2 
# 8  2020-05-28 00:15:33 00:15:33   3 
# 9  2020-05-28 04:15:33 04:15:33   3 
# 10 2020-05-28 22:15:33 22:15:33   3 
# 11 2020-05-29 00:15:33 00:15:33   4 

这将是正确的结果:

# Sample Data - CORRECT RESULT
   
    df_result
    #              timestamp     time day  night
    # 1  2020-05-26 04:15:33 04:15:33   1 night0
    # 2  2020-05-26 06:15:33 06:15:33   1 night0
    # 3  2020-05-26 22:15:33 22:15:33   1 night1
    # 4  2020-05-26 23:15:33 23:15:33   1 night1
    # 5  2020-05-27 00:15:33 00:15:33   2 night1
    # 6  2020-05-27 04:15:33 04:15:33   2 night1
    # 7  2020-05-27 22:15:33 22:15:33   2 night2
    # 8  2020-05-28 00:15:33 00:15:33   3 night2
    # 9  2020-05-28 04:15:33 04:15:33   3 night2
    # 10 2020-05-28 22:15:33 22:15:33   3 night3
    # 11 2020-05-29 00:15:33 00:15:33   4 night3

【问题讨论】:

    标签: r if-statement dplyr timestamp subset


    【解决方案1】:

    由于您只包含夜间数据,因此只需在 if 语句中使用 12:00 作为新夜晚的截止时间:

    df %>% 
      mutate(night = paste0("night", as.numeric(ifelse(time <= "12:00:00", -1, 0)) + as.numeric(day)))
    
    
                 timestamp     time day  night
    1  2020-05-26 04:15:33 04:15:33   1 night0
    2  2020-05-26 06:15:33 06:15:33   1 night0
    3  2020-05-26 22:15:33 22:15:33   1 night1
    4  2020-05-26 23:15:33 23:15:33   1 night1
    5  2020-05-27 00:15:33 00:15:33   2 night1
    6  2020-05-27 04:15:33 04:15:33   2 night1
    7  2020-05-27 22:15:33 22:15:33   2 night2
    8  2020-05-28 00:15:33 00:15:33   3 night2
    9  2020-05-28 04:15:33 04:15:33   3 night2
    10 2020-05-28 22:15:33 22:15:33   3 night3
    11 2020-05-29 00:15:33 00:15:33   4 night3
    
    

    【讨论】:

    • 这会导致夜间列中出现“nightNA”和以下警告:1:mutate() 输入问题night。 ℹ‘night是paste0(...)。 2:在 Ops.factor(time, "12:00:00") 中:'
    • 该错误似乎表明您的某个列被格式化为一个因素,这与上面帖子中的示例不同。如果是时候,将ifelse(time &lt;= ... 更改为ifelse(as.character(time) &lt;= ... 将起作用。一个因素不适用于 ifelse
    • 现在可以使用了,谢谢! (你是对的,不知何故“时间”变量类在再次创建示例数据时更改为因子......)
    【解决方案2】:

    我会先计算从开始日期 2020-05-26 到当前日期的差值。如何做到这一点可以在这里找到: calculating number of days between 2 columns of dates in data frame

    然后用 IF 语句创建一个数字列:IF time (later) 12:00 THAN +1

    如果您在执行此操作时遇到困难,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2018-02-21
      • 2021-02-15
      • 2016-04-08
      • 2019-11-07
      • 2015-09-24
      相关资源
      最近更新 更多