Я использую пакет DPLYR в R, чтобы «суммировать» некоторые входные данные.

Шаг 1: Подсчитайте количество записей (n), на заданную дату (дату), с определенным значением индекса (IDX) в дополнительном к другому категоричному значению в столбце A.

T <- orig_data %>% group_by(A, Date, Idx) %>% summarise(N=n())

<Сильный> Шаг 2: Создайте совокупную сумму количества счетчиков на заданную дату с заданным значением индекса или выше.

T2 <- T %>% mutate(cN=cumsum(N))

Однако некоторые значения IDX между его максимумом и минимумом отсутствуют в таблице, например, IDX = 10 отсутствует в примере ниже.

A   Date        Idx N   cN
N   2020-10-01  8   18  85
N   2020-10-01  9   6   91
N   2020-10-01  11  1   92
N   2020-10-01  13  10  102

Я хотел бы добавить ряд для каждого пропущенного значения IDX, каждый день, когда оно отсутствует, например, e.g.

N   2020-10-01  10  0   91  

Я попытался использовать простейшую возможную версию функции заполнения, чтобы попытаться попытаться, но она не производила заметных изменений в результатах (возможно, потому что IDX интерпретируется как список, а не вектор?)

T3 <- T2 %>% fill(cN)

Есть ли способ легко добавить вышеуказанную строку и определить любые другие пропущенные строки и добавьте их в таблицу?

1
NaiveBayesian 5 Июн 2021 в 02:02

2 ответа

Лучший ответ

Решение с использованием функций {tidyr: complete и nesting. Я видел, как вы прокомментировали еще один пост, говоря, что вы пробовали функцию complete, но это медленно. Попробуйте nesting столбцы, чтобы увидеть, если это поможет.

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  complete(nesting(A, Date), Idx = full_seq(Idx, period = 1), fill = list(N = 0)) %>%
  fill(cN)
dat2
# # A tibble: 6 x 5
#   A     Date         Idx     N    cN
#   <chr> <chr>      <dbl> <dbl> <int>
# 1 N     2020-10-01     8    18    85
# 2 N     2020-10-01     9     6    91
# 3 N     2020-10-01    10     0    91
# 4 N     2020-10-01    11     1    92
# 5 N     2020-10-01    12     0    92
# 6 N     2020-10-01    13    10   102
1
www 5 Июн 2021 в 03:07

Лучшее решение, которое я нашел (я работал в той же проблеме раньше) - создать подставку DataFrame, который включает в себя завершенную последовательность, которую я забочусь о. Затем я присоединяюсь к моим действительным, основным набором данных в этом режиме ожидания.

Это немного хаки, но он может быть достигнут только в нескольких линиях. Это также производит результаты интереса.

library(dplyr)

df <- data.frame(idx = c(8, 9, 11, 12), n = c(11, 22, 33, 44)) %>% 
  left_join(
    x = data.frame(idx = seq(min(.$idx), max(.$idx))),
    y = .)

df

Выход:

  idx  n
1   8 11
2   9 22
3  10 NA
4  11 33
5  12 44
0
Ian Cero 5 Июн 2021 в 02:41