Построение переменных лагов на основе дополнительного условия - PullRequest
1 голос
/ 25 апреля 2020

Я хочу создать лаговую переменную на основе следующих дополнительных условий и операций:

  • Когда лаг (предыдущая строка) переменной (day_active) равен 1, он также должен Возьмите лаг переменной n_wins

  • Когда лаг (предыдущая строка) для day_active равен 0, он должен просто повторять значение n_wins предыдущей строки, пока day_active остается равным 0.

Предположим, мы наблюдаем за игроком в течение десяти дней. day_active указывает, был ли он активным в тот день, а n_wins указывает количество выигранных им игр.

Example dataset:
    da = data.frame(day = c(1,2,3,4,5,6,7,8,9,10), day_active = c(1,1,0,0,1,1,0,0,1,1), n_wins = c(2,3,0,0,1,0,0,0,0,1))

da
   day day_active n_wins
1    1          1      2
2    2          1      3
3    3          0      0
4    4          0      0
5    5          1      1
6    6          1      0
7    7          0      0
8    8          0      0
9    9          1      0
10  10          1      1

Вот как это должно выглядеть после трансформации:

da2 = data.frame(day = c(1,2,3,4,5,6,7,8,9,10), day_active = c(1,1,0,0,1,1,0,0,1,1), n_wins = c(2,3,0,0,1,0,0,0,0,1), lag_n_wins = c(NA,2,3,3,3,1,0,0,0,0))
da2
   day day_active n_wins lag_n_wins
1    1          1      2         NA
2    2          1      3          2
3    3          0      0          3
4    4          0      0          3
5    5          1      1          3
6    6          1      0          1
7    7          0      0          0
8    8          0      0          0
9    9          1      0          0
10  10          1      1          0

1 Ответ

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

Мы можем создать столбец группировки на основе присутствия 1 в 'day_active', взяв кумулятивную сумму логического вектора, затем if все значения не равны 0, замените на NA и замените NA с предыдущим не-NA элементом с na.locf (из zoo), ungroup и возьмите lag созданного столбца

library(dplyr)    
da %>%
     group_by(grp = cumsum(day_active == 1)) %>%
     mutate(lag_n_wins = zoo::na.locf0(if(all(n_wins == 0)) n_wins 
                  else na_if(n_wins, 0)) ) %>%
     ungroup %>% 
     mutate(lag_n_wins = lag(lag_n_wins)) %>%
     select(-grp)
# A tibble: 10 x 4
#     day day_active n_wins lag_n_wins
#   <dbl>      <dbl>  <dbl>      <dbl>
# 1     1          1      2         NA
# 2     2          1      3          2
# 3     3          0      0          3
# 4     4          0      0          3
# 5     5          1      1          3
# 6     6          1      0          1
# 7     7          0      0          0
# 8     8          0      0          0
# 9     9          1      0          0
#10    10          1      1          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...