【问题标题】:Maintain order of time series with group_by使用 group_by 维护时间序列的顺序
【发布时间】:2020-04-22 17:44:58
【问题描述】:

假设我的时间序列只包含两列:信号和日期

信号变量应该在 1 到 6 的循环中重复。所以我需要为每个隐式缺失的信号插入空行,但信号计数从 1 到 6。(假设我还有更多的列也应该是空 (NA))。 换句话说,对于每个独特的日子,应该有 6 行信号计数从 1 到 6。

我的数据框:

df = structure(list(data.Signal = c(2, 3, 4, 5, 6, 1, 2, 3, 4, 6, 
1, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 1, 2, 3, 4, 5, 6, 2, 3, 4, 
5, 6, 1, 3, 4, 5, 6, 2, 3, 4, 5, 6, 3, 4, 6, 1, 3, 4, 5, 6, 1, 
2, 3, 4, 5, 6, 1, 2, 3, 4, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 
6, 1, 2, 3, 4, 5, 1, 2, 3, 4, 6, 2, 3, 6, 3, 4, 5, 6, 1, 3, 4, 
5, 6, 1, 1, 2, 3, 4, 5, 3, 4, 1, 2, 3, 4, 5, 5, 1, 2, 3, 4), 
    data.day = c(18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 
    20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 23, 23, 23, 23, 
    23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 
    26, 26, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 
    29, 30, 30, 30, 30, 30, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 
    2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 
    7, 7, 7, 7, 8, 9, 9, 9, 9, 9, 10, 10, 11, 11, 11, 11, 11, 
    11, 12, 12, 12, 12)), class = "data.frame", row.names = c(NA, 
-114L))

我的做法:

data <- df %>%
  group_by(gr=data.day) %>%
  complete(data.Signal = 1:6) %>%
  ungroup() %>% 
  select(-gr)

但是,这会按升序对天数进行排序。天的顺序在时间序列数据中显然是有意义的。我怎样才能“重新排序”到原来的顺序,还是有另一种方法来解决我的问题?谢谢!

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    在使用complete之前将data.day转换为factor

    library(dplyr)
    
    df %>%
      group_by(gr = factor(data.day, levels = unique(data.day))) %>%
      tidyr::complete(data.Signal = 1:6) %>%
      ungroup() %>% 
      select(-gr)
    
    
    #  data.Signal data.day
    #         <dbl>    <dbl>
    # 1           1       NA
    # 2           2       18
    # 3           3       18
    # 4           4       18
    # 5           5       18
    # 6           6       18
    # 7           1       19
    # 8           2       19
    # 9           3       19
    #10           4       19
    # … with 141 more rows
    

    如果你想填充那些NA,你可以使用这个版本。

    df %>%
     mutate(grp = factor(data.day, levels = unique(data.day))) %>%
     complete(grp, data.Signal = 1:6) %>%
     ungroup() %>% 
     select(-data.day)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2015-06-27
      相关资源
      最近更新 更多