Поддерживать порядок временных рядов с group_by - PullRequest
0 голосов
/ 22 апреля 2020

Предположим, что мой временной ряд состоит только из двух столбцов: signal и day

Переменная сигнала должна повторяться в цикле от 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)

Это, однако, сортирует дни по возрастанию. Порядок дней явно значим в данных временных рядов. Как я могу «пересортировать» исходный заказ или есть другой способ решения моей проблемы? Спасибо!

1 Ответ

1 голос
/ 22 апреля 2020

Преобразование data.day в factor перед использованием complete

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