Вменение NA, основанное на групповой переменной и смежной переменной - PullRequest
1 голос
/ 08 мая 2019

Набор данных

df <- data.frame(ID = c(55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
                        66, 66, 66, 66, 66, 66, 66, 66, 66, 66),
                 counter = c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
                             0, 1, 1, 1, 1, 1, 1, 1, 1, 1))

Приведенный ниже код создает две , три и четыре функции, которые подсчитывают последние два, три или четыре наблюдения, без текущей строки счетчик особенность. Расчет сгруппирован по ID .

setDT(df)[,  two := Reduce(`+`, shift(counter, 1:2)), by = ID]
setDT(df)[,  three := Reduce(`+`, shift(counter, 1:3)), by = ID]
setDT(df)[,  four := Reduce(`+`, shift(counter, 1:4)), by = ID]

Как это выглядит сейчас:

    ID counter two three four
 1: 55       0  NA    NA   NA
 2: 55       1  NA    NA   NA
 3: 55       1   1    NA   NA
 4: 55       1   2     2   NA
 5: 55       1   2     3    3
 6: 55       1   2     3    4
 7: 55       1   2     3    4
 8: 55       1   2     3    4
 9: 55       1   2     3    4
10: 55       1   2     3    4
11: 66       0  NA    NA   NA
12: 66       1  NA    NA   NA
13: 66       1   1    NA   NA
14: 66       1   2     2   NA
15: 66       1   2     3    3
16: 66       1   2     3    4
17: 66       1   2     3    4
18: 66       1   2     3    4
19: 66       1   2     3    4
20: 66       1   2     3    4

Цель:

   ID counter two three four
1  55       0   0     0    0
2  55       1   0     0    0
3  55       1   1     1    1
4  55       1   1     2    2
5  55       1   2     3    3
6  55       1   2     3    4
7  55       1   2     3    4
8  55       1   2     3    4
9  55       1   2     3    4
10 55       1   2     3    4
11 66       0   0     0    0
12 66       1   0     0    0
13 66       1   1     1    1
14 66       1   1     2    2
15 66       1   2     3    3
16 66       1   2     3    4
17 66       1   2     3    4
18 66       1   2     3    4
19 66       1   2     3    4
20 66       1   2     3    4

1 Ответ

2 голосов
/ 08 мая 2019

Мы можем указать fill параметр

setDT(df)[,  two := Reduce(`+`, shift(counter, 1:2, fill = 0)), by = ID]
...