Формула для заполнения ячеек NA эквивалентна заполнению их с использованием na.locf
плюс взятие в 0,3 раза большего количества B
значений, соответствующих значениям NA в C
.
Итак, сначаласоздайте выражение для вектора группировки, связывающего уникальное число с каждым не-NA и каждым отрезком последовательных NA.
rleid(seq_along(C) * !is.na(C)))
Для каждой из этих групп вычислите вектор кумулятивных сумм B * is.na(C)
, который равен 0если группа имеет один элемент, отличный от NA, и имеет значение cumsum
, если группа состоит из последовательных NA.
Это дает следующее решение с одним оператором:
library(data.table)
library(zoo)
transform(DT, C = ave(C, id, FUN = na.locf0) +
0.3 * ave(B * is.na(C), rleid(seq_along(C) * !is.na(C)), id, FUN = cumsum))
, что дает:
id B C
1 A 1 NA
2 A 2 2.0
3 A 3 3.0
4 A 4 4.0
5 A 5 5.0
6 A 6 6.8
7 A 7 8.9
8 A 8 11.3
9 A 9 14.0
10 A 10 17.0
11 B 3 NA
12 B 6 6.0
13 B 9 9.0
14 B 12 12.0
15 B 15 15.0
16 B 18 20.4
17 B 21 26.7
18 B 24 33.9
19 B 27 42.0
20 B 30 51.0